{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Tutorial on Causal Inference and its Connections to Machine Learning (Using DoWhy+EconML)\n",
    "This tutorial presents a walk-through on using DoWhy+EconML libraries for causal inference. Along the way, we'll highlight the connections to machine learning---how machine learning helps in building causal effect estimators, and how causal reasoning can be help build more robust machine learning models. \n",
    "\n",
    "Examples of data science questions that are fundamentally causal inference questions: \n",
    "* **A/B experiments**: If I change the algorithm, will it lead to a higher success rate?\n",
    "* **Policy decisions**: If we adopt this treatment/policy, will it lead to a healthier patient/more revenue/etc.?\n",
    "* **Policy evaluation**: Knowing what I know now, did my policy help or hurt?\n",
    "* **Credit attribution**: Are people buying because of the recommendation algorithm? Would they have bought anyway?\n",
    "\n",
    "In this tutorial, you will:\n",
    "* Learn how causal reasoning is necessary for decision-making, and the difference between a prediction and decision-making task.\n",
    "<br>\n",
    "\n",
    "* Get hands-on with estimating causal effects using the four steps of causal inference: **model, identify, estimate and refute**.\n",
    "<br>\n",
    "\n",
    "* See how DoWhy+EconML can help you estimate causal effects with **4 lines of code**, using the latest methods from statistics and machine learning to estimate the causal effect and evaluate its robustness to modeling assumptions.\n",
    "<br>\n",
    "\n",
    "* Work through **real-world case-studies** with Jupyter notebooks on applying causal reasoning in different scenarios including estimating impact of a customer loyalty program on future transactions, predicting which users will be positively impacted by an intervention (such as an ad), pricing products, and attributing which factors contribute most to an outcome.\n",
    "<br>\n",
    "\n",
    "* Learn about the connections between causal inference and the challenges of modern machine learning models."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "toc": true
   },
   "source": [
    "<h1>Table of Contents<span class=\"tocSkip\"></span></h1>\n",
    "<div class=\"toc\"><ul class=\"toc-item\"><li><span><a href=\"#Why-causal-inference?\" data-toc-modified-id=\"Why-causal-inference?-1\"><span class=\"toc-item-num\">1&nbsp;&nbsp;</span>Why causal inference?</a></span><ul class=\"toc-item\"><li><span><a href=\"#Defining-a-causal-effect\" data-toc-modified-id=\"Defining-a-causal-effect-1.1\"><span class=\"toc-item-num\">1.1&nbsp;&nbsp;</span>Defining a causal effect</a></span></li><li><span><a href=\"#The-difference-between-prediction-and-causal-inference\" data-toc-modified-id=\"The-difference-between-prediction-and-causal-inference-1.2\"><span class=\"toc-item-num\">1.2&nbsp;&nbsp;</span>The difference between prediction and causal inference</a></span></li><li><span><a href=\"#Two-fundamental-challenges-for-causal-inference\" data-toc-modified-id=\"Two-fundamental-challenges-for-causal-inference-1.3\"><span class=\"toc-item-num\">1.3&nbsp;&nbsp;</span>Two fundamental challenges for causal inference</a></span></li></ul></li><li><span><a href=\"#The-four-steps-of-causal-inference\" data-toc-modified-id=\"The-four-steps-of-causal-inference-2\"><span class=\"toc-item-num\">2&nbsp;&nbsp;</span>The four steps of causal inference</a></span><ul class=\"toc-item\"><li><span><a href=\"#The-DoWhy+EconML-solution\" data-toc-modified-id=\"The-DoWhy+EconML-solution-2.1\"><span class=\"toc-item-num\">2.1&nbsp;&nbsp;</span>The DoWhy+EconML solution</a></span></li><li><span><a href=\"#A-mystery-dataset:-Can-you-find-out-if-if-there-is-a-causal-effect?\" data-toc-modified-id=\"A-mystery-dataset:-Can-you-find-out-if-if-there-is-a-causal-effect?-2.2\"><span class=\"toc-item-num\">2.2&nbsp;&nbsp;</span>A mystery dataset: Can you find out if if there is a causal effect?</a></span><ul class=\"toc-item\"><li><span><a href=\"#Model-assumptions-about-the-data-generating-process-using-a-causal-graph\" data-toc-modified-id=\"Model-assumptions-about-the-data-generating-process-using-a-causal-graph-2.2.1\"><span class=\"toc-item-num\">2.2.1&nbsp;&nbsp;</span>Model assumptions about the data-generating process using a causal graph</a></span></li><li><span><a href=\"#Identify-the-correct-estimand-for-the-target-quantity-based-on-the-causal-model\" data-toc-modified-id=\"Identify-the-correct-estimand-for-the-target-quantity-based-on-the-causal-model-2.2.2\"><span class=\"toc-item-num\">2.2.2&nbsp;&nbsp;</span>Identify the correct estimand for the target quantity based on the causal model</a></span></li><li><span><a href=\"#Estimate-the-target-estimand\" data-toc-modified-id=\"Estimate-the-target-estimand-2.2.3\"><span class=\"toc-item-num\">2.2.3&nbsp;&nbsp;</span>Estimate the target estimand</a></span></li><li><span><a href=\"#Check-robustness-of-the-estimate-using-refutation-tests\" data-toc-modified-id=\"Check-robustness-of-the-estimate-using-refutation-tests-2.2.4\"><span class=\"toc-item-num\">2.2.4&nbsp;&nbsp;</span>Check robustness of the estimate using refutation tests</a></span></li></ul></li></ul></li><li><span><a href=\"#Case-studies-using-DoWhy+EconML\" data-toc-modified-id=\"Case-studies-using-DoWhy+EconML-3\"><span class=\"toc-item-num\">3&nbsp;&nbsp;</span>Case-studies using DoWhy+EconML</a></span><ul class=\"toc-item\"><li><span><a href=\"#Estimating-the-impact-of-a-customer-loyalty-program\" data-toc-modified-id=\"Estimating-the-impact-of-a-customer-loyalty-program-3.1\"><span class=\"toc-item-num\">3.1&nbsp;&nbsp;</span>Estimating the impact of a customer loyalty program</a></span></li><li><span><a href=\"#Recommendation-A/B-testing-at-an-online-company\" data-toc-modified-id=\"Recommendation-A/B-testing-at-an-online-company-3.2\"><span class=\"toc-item-num\">3.2&nbsp;&nbsp;</span>Recommendation A/B testing at an online company</a></span></li><li><span><a href=\"#User-segmentation-for-targeting-interventions\" data-toc-modified-id=\"User-segmentation-for-targeting-interventions-3.3\"><span class=\"toc-item-num\">3.3&nbsp;&nbsp;</span>User segmentation for targeting interventions</a></span></li><li><span><a href=\"#Multi-investment-attribution-at-a-software-company\" data-toc-modified-id=\"Multi-investment-attribution-at-a-software-company-3.4\"><span class=\"toc-item-num\">3.4&nbsp;&nbsp;</span>Multi-investment attribution at a software company</a></span></li></ul></li><li><span><a href=\"#Connections-to-fundamental-machine-learning-challenges\" data-toc-modified-id=\"Connections-to-fundamental-machine-learning-challenges-4\"><span class=\"toc-item-num\">4&nbsp;&nbsp;</span>Connections to fundamental machine learning challenges</a></span></li><li><span><a href=\"#Further-resources\" data-toc-modified-id=\"Further-resources-5\"><span class=\"toc-item-num\">5&nbsp;&nbsp;</span>Further resources</a></span><ul class=\"toc-item\"><li><span><a href=\"#DoWhy+EconML-libraries\" data-toc-modified-id=\"DoWhy+EconML-libraries-5.1\"><span class=\"toc-item-num\">5.1&nbsp;&nbsp;</span>DoWhy+EconML libraries</a></span></li><li><span><a href=\"#Video-Lecture-on-causal-inference-and-its-connections-to-machine-learning\" data-toc-modified-id=\"Video-Lecture-on-causal-inference-and-its-connections-to-machine-learning-5.2\"><span class=\"toc-item-num\">5.2&nbsp;&nbsp;</span>Video Lecture on causal inference and its connections to machine learning</a></span></li><li><span><a href=\"#Detailed-KDD-Tutorial-on-Causal-Inference\" data-toc-modified-id=\"Detailed-KDD-Tutorial-on-Causal-Inference-5.3\"><span class=\"toc-item-num\">5.3&nbsp;&nbsp;</span>Detailed KDD Tutorial on Causal Inference</a></span></li><li><span><a href=\"#Book-chapters-on-causality-and-machine-learning\" data-toc-modified-id=\"Book-chapters-on-causality-and-machine-learning-5.4\"><span class=\"toc-item-num\">5.4&nbsp;&nbsp;</span>Book chapters on causality and machine learning</a></span></li><li><span><a href=\"#Causality-and-Machine-Learning-group-at-Microsoft\" data-toc-modified-id=\"Causality-and-Machine-Learning-group-at-Microsoft-5.5\"><span class=\"toc-item-num\">5.5&nbsp;&nbsp;</span>Causality and Machine Learning group at Microsoft</a></span></li></ul></li></ul></div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Why causal inference?\n",
    "Many key data science tasks are about decision-making. Data scientists are regularly called upon to support decision-makers at all levels, helping them make the best use of data in support of achieving desired outcomes. For example,  an executive making investment and resourcing decisions, a marketer determining discounting policies, a product team prioritizing which features to ship, or a doctor deciding which treatment to administer to a patient.  \n",
    "\n",
    "Each of these decision-makers is asking a what-if question.  Data-driven answers to such questions require understanding the *causes* of an event and how to take action to improve future outcomes.\n",
    "\n",
    "### Defining a causal effect \n",
    "Suppose that we want to find the causal effect of taking an action A on the outcome Y. To define the causal effect, consider two worlds: \n",
    "1. World 1 (Real World): Where the action A was taken and Y observed\n",
    "2. World 2 (*Counterfactual* World): Where the action A was not taken (but everything else is the same) \n",
    "\n",
    "Causal effect is the difference between Y values attained in the real world versus the counterfactual world. \n",
    "$${E}[Y_{real, A=1}] - E[Y_{counterfactual, A=0}]$$\n",
    "\n",
    "![Real and Counterfactual Worlds](images/real_vs_counterfactual_world.png)\n",
    "\n",
    "In other words, A causes Y iff changing A leads to a change in Y,\n",
    "*keeping everything else constant*. Changing A while keeping everything else constant is called an **intervention**, and represented by a special notation, $do(A)$. \n",
    "\n",
    "Formally, causal effect is the magnitude by which Y is changed by a unit *interventional* change in A:\n",
    "$$E[Y│do(A=1)]−E[Y|do(A=0)]$$\n",
    "\n",
    "To estimate the effect, the *gold standard* is to conduct a randomized experiment where a randomized subset of units is acted upon ($A=1$) and the other subset is not ($A=0$). These subsets approximate the disjoint real and counterfactual worlds and randomization ensures that there is not systematic difference between the two subsets (*\"keeping everything else constant\"*). \n",
    "\n",
    "However, it is not always feasible to a run a randomized experiment. To answer causal questions, we often need to rely on observational or logged data. Such observed data is biased by correlations and unobserved confounding and thus there are systematic differences in which units were acted upon and which units were not. For example, a new marketing campaign may be deployed during the holiday season, a new feature may only have been applied to high-activity users, or the older patients may have been more likely to receive the new drug, and so on. The goal of causal inference methods is to remove such correlations and confounding from the data and estimate the *true* effect of an action, as given by the equation above. \n",
    "\n",
    "\n",
    "### The difference between prediction and causal inference\n",
    "\n",
    "<table><tr>\n",
    "<td> <img src=\"images/supervised_ml_schematic.png\" alt=\"Drawing\" style=\"width: 400px;\"/> </td>\n",
    "<td> <img src=\"images/causalinference_schematic.png\" alt=\"Drawing\" style=\"width: 400px;\"/> </td>\n",
    "</tr></table>\n",
    "\n",
    "### Two fundamental challenges for causal inference\n",
    "We never observe the counterfactual world\n",
    "\n",
    "* Cannot directly calculate the causal effect\n",
    "* Must estimate the counterfactuals \n",
    "* Challenges in validation\n",
    "\n",
    "Multiple causal mechanisms can be fit to a single data distribution\n",
    "* Data alone is not enough for causal inference\n",
    "* Need domain knowledge and assumptions\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## The four steps of causal inference\n",
    "\n",
    "Since there is no ground-truth test dataset available that an estimate can be compared to, causal inference requires a series of principled steps to achieve a good estimator. \n",
    "\n",
    "Let us illustrate the four steps through a sample dataset. This tutorial requires you to download two libraries: DoWhy and EconML. Both can be installed by the following command: `pip install dowhy econml`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Required libraries\n",
    "import dowhy\n",
    "from dowhy import CausalModel\n",
    "import dowhy.datasets\n",
    "\n",
    "# Avoiding unnecessary log messges and warnings\n",
    "import logging\n",
    "logging.getLogger(\"dowhy\").setLevel(logging.WARNING)\n",
    "import warnings\n",
    "from sklearn.exceptions import DataConversionWarning\n",
    "warnings.filterwarnings(action='ignore', category=DataConversionWarning)\n",
    "\n",
    "# Load some sample data\n",
    "data = dowhy.datasets.linear_dataset(\n",
    "    beta=10,\n",
    "    num_common_causes=5,\n",
    "    num_instruments=2,\n",
    "    num_samples=10000,\n",
    "    treatment_is_binary=True,\n",
    "    stddev_treatment_noise=10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**I. Modeling**\n",
    "\n",
    "The first step is to encode our domain knowledge into a causal model, often represented as a graph. The final outcome of a causal inference analysis depends largely on the input assumptions, so this step is quite important. To estimate the causal effect, most common problems involve specifying two types of variables: \n",
    "\n",
    "1. **Confounders (common_causes)**: These are variables that cause both the action and the outcome. As a result, any observed correlation between the action and the outcome may simply be due to the confounder variables, and not due to any causal relationship from the action to the outcome. \n",
    "\n",
    "2. **Instrumental Variables (instruments)**: These are special variables that cause the action, but do not directly affect the outcome. In addition, they are not affected by any variable that affects the outcome. Instrumental variables can help reduce bias, if used in the correct way. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# I. Create a causal model from the data and domain knowledge.\n",
    "model = CausalModel(\n",
    "    data=data[\"df\"],\n",
    "    treatment=data[\"treatment_name\"],\n",
    "    outcome=data[\"outcome_name\"],\n",
    "    common_causes=data[\"common_causes_names\"],\n",
    "    instruments=data[\"instrument_names\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To visualize the graph, we can write,"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdMAAAD7CAYAAAAxdn5CAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOydeVhUdfvG7zPMsO8IgrgnsWm4b+SC4JJiaUluUVaKW/qaS1SamFqZZqH1arwuiVoamqaoueSGu+arue+5K5DIErLO3L8//DGvyA7nzJnB87kuruzMzPO95xbnmfNdnkcgSSgoKCgoKChUljUquRUoKCgoKCiYOkoyVVBQUFBQqCJKMlVQUFBQUKgiarkFPIlWq0ViYiISExORmpoKrVaLjIwM5Ofnw9raGhYWFrCysoKjoyM8PDzg7Owst+RqheK/vCj+y4viv7yYuv+yJNOsrCwcO3YMp06dwpkzZ3D27FlcvXoVSUlJ0Gq15Y5jaWmJ2rVrw9vbG40bN4a/vz+aN28OPz8/CIIg4TswbRT/5UXxX14U/+WluvovGGI3r06nw5EjR7Blyxbs2bMHx44dQ05ODpydnfUmeHt7w8PDA7Vq1ULNmjXh7OwMlUoFOzs7qNVqPHr0CDk5OcjOzkZKSgru3r2Le/fu4datWzh37hzOnj2L8+fPIzc3F66urujQoQOCgoLw8ssvo27dulK/RaNG8V9eFP/lRfFfXp4R/9dImkwPHDiAH3/8ERs2bMDdu3fx3HPPoXPnzujUqRM6deok+pvMz8/HyZMnkZCQgL1792Lv3r1IT09HixYt8Nprr+HNN99ErVq1RB3TmFH8lxfFf3lR/JeXZ8z/NaDIZGRk8N///jebNGlCAHzhhRf46aef8tSpU2IPVSY5OTn87bffGBERwRo1alCtVrNv377cvn27wbUYCsV/eVH8lxfFf3l5hv2PEy2ZZmRkMDo6mu7u7rS0tGRYWBh37NghVvgqk5OTw7i4OIaEhFAQBL7wwguMi4ujTqeTW5ooKP7Li+K/vCj+y4vivwjJVKvVcsGCBXRxcaG9vT2nTJnCBw8eiCFOMo4fP86XX36ZgiCwdevWPHr0qNySKo3iv7wo/suL4r+8KP7rqVoyPX78OFu1akWNRsOJEycavYlP89///pedO3emSqXiiBEj+PDhQ7klVQjFf3lR/JcXxX95UfwvROWSqU6n45dffkmNRsOOHTvyzJkzVREhKzqdjitWrKC7uzvr1avHAwcOyC2pTBT/5UXxX14U/+VF8b9YKp5MU1JS2K1bN2o0Gs6ePbvazPknJyezV69eVKvVnD17ttxySkTxX14U/+VF8V9eFP9LpGLJ9ObNm/T392edOnVMep6/JHQ6HefOnUszMzOOHDmS+fn5cksqhOK/vCj+y4viv7wo/pdK+ZPp5cuXWbt2bTZp0oS3b9+uuFITYv369bSysmK/fv2Yl5cntxySiv9yo/gvL4r/8qL4XyblS6Z3795lw4YN2bp1a5NbJK8sCQkJtLa25jvvvCP7VIbiv+K/oVH8lxfFf3mphP9lJ9PMzEwGBATQx8eHycnJVVdpQmzevJkajYZRUVGyaVD8V/yXC8V/eVH8l5cK+l92Mh0xYgSdnJx4/fr1KoszRb7//nuqVCru3r1blvEV/xX/5UTxX14U/+WlAv6Xnkw3btxIQRC4du1a0cSZIv369WPt2rUNPsWh+P8YxX95UfyXF8V/eSmn/yUn05ycHD733HMcPHhwlcXUrFmTAAr9nD9/vtBzXnvtNQIosrg9efLkQq/74osv9I+dOHGCPXv2pIODA21tbRkcHMz9+/dXWe/TpKSk0NXVlZMmTRI9dkmYgv/k46kQLy8vmpmZVVlnSSj+F/Y/JSWFCxcuZFBQEJ2cnGhpaclGjRpx0KBBPHnyZJX1Po3if2H/dTod9+/fz1GjRtHLy4vm5uZ0dXVlYGAgV6xYIfoap+J/yZ8/BfTu3ZsAOGPGjCrrfZpy+l9yMv3mm29oZWXFmzdviiLoP//5DwFw3LhxRR7Lz8+no6MjAXDJkiVFHn/w4AEdHR2Zm5urv3b48GFaWVmxf//+vHv3LpOTkzls2DCq1Wpu27ZNFM1PMn/+fFpaWhpsusPY/b9y5Qp79+7NF154gfb29pImU1Lx/0n/3333XarVakZHR/PevXvMzMxkQkIC/fz8aGZmxvXr14ui+UkU///n//nz5wmAISEh/PPPP5mVlcWrV69y4MCBBMAJEyaIovlJFP8Lf/48SWxsrD7ZSpFMyXL5X3wy1Wq1rFu3LsePHy+amJs3bxIAfXx8ijx24MABWltbEwDDwsKKPL569Wq+8sorhfT5+/vTw8ODjx490l/Pz8+nt7c369Spw+zsbNG0k4+/qdWtW9cg3w6N3X+SHDhwIL/44gvm5eXR09NT8mSq+P8//999911GREQUed7JkycJgF5eXqLpLkDx/3/+nz9/nmq1mikpKYWel5OTQxcXF1pYWCifP08h9udPAXfu3KGTkxPDw8MlTabl8L/4ZLpt27Zib8Wriq+vLwHwxo0bha5PnTqV48ePp62tLZ2cnIocln377be5YMEC/f/v3r2bADhmzJgiY0ybNo0AJJnnj4qKYs2aNUv8hiQWxu4/yUJfYgyRTEnF//JgZWVFlUolyXEKxf+yadq0KQEwNTVVNN0FKP4XpWfPnoyIiOCKFSskTaZkmf7HqYrrcrp69Wq0a9cOPj4+JbdCrQQ9evQAAGzdurXQ9a1bt6J3797o0qULHj58iKNHjxZ6fPv27frXAsCuXbsAAC1btiwyRsG1nTt3iqodAN5++20kJSVh9+7dosd+EmP3HwCsrKxE1VYeFP9LJzMzE1lZWWjcuDEEQRBP+P+j+F86qampuHz5Mpo1awYHBwfxhP8/iv+FWbp0Kc6ePYuvvvpKVJ0lUZb/xSbTffv2oWvXrqKL6d69OwBg27Zt+mspKSm4cOEC2rdvX+zjZ86cgbW1NRo0aKC/duHCBQBA7dq1i4zh6ekJALh06ZLo+uvVq4dGjRph//79osd+EmP3Xy4U/0tnzZo1AIDJkyeLKVuP4n/xpKen48CBA3j55Zfh7u6O5cuXi64dUPx/ktu3b2PChAlYunQp7OzsRNdaHGX5XySZ/v3337h69SratWsnuphOnTrBysoKO3fuRH5+PgBgx44d6NSpE8zNzfVmPvnNZdu2bfrrBaSmpgIAbGxsioxha2sLAHj48KHo+gGgffv2OHTokCSxAdPwX04U/4snMTERH374IYYOHYrXX39ddO0FKP4XZubMmXBwcMCLL74IMzMzrF+/Ho0bNxZdewGK/48ZOnQoBg0ahC5duoiuszRK879IMr1x4wZIwtvbW3QhlpaW6NixI9LS0nD48GEAhc167rnn8Nxzz+HYsWNISUnRP16eKZYCSAKAJNNcAPD888/j+vXrksQGTN9/qVH8L8qDBw/Qo0cPdO7cGd9//73oup9E8b8wU6ZMQU5ODs6fPw8fHx80a9YMM2bMEF17AYr/wKJFi3D58mXMnj1bdI1lUZr/xd6ZAoCLi4skYp7+9vH0fHiPHj2g0+mwY8cOZGVl4ejRo+jcuXOhGI6OjgAerxE9TcG1gueIjYuLCx48eCBJbMA0/JcTxf/CZGZmonv37vDz88OPP/4IMzMzSXQXoPhfFHNzc/j4+GDhwoV4+eWXMXXqVPz++++S6H/W/b958yYmTZqEpUuXFjszKTWl+V8kmWZlZQGQboNJgXHbtm3D6dOnYWlpieeee07/+JPz5nv37kXLli2LmFawMH779u0i8e/cuQPg8TcIKbC1tS02iYuFKfgvJ4r//yM/Px9hYWHw9PREbGys5IkUUPwvi969ewMANm3aJKLq//Gs+x8fH4+0tDR07twZgiDof8LDwwEAn3zyif7alStXRNdfmv9FkqmTkxMA6dYcfX19UadOHRw/fhwrV64sMh8eFBQEc3NzbNu2DVu3bi12vjwoKAgAcPz48SKPFVwLDg6WQP3jKTVnZ2dJYgOm4b+cKP7/j+HDhyMnJwdxcXFQq9X6640aNdJPo4mN4n/pWFhYAIB+mlJsnnX/R48eDZJFflasWAEAmDFjhv5ao0aNRNdfmv9FkmnB7X1ycrLoQgro3r07SGL+/PlF5sNtbW0RGBiIu3fvYtmyZcX+Mnfq1Al+fn5Yu3YtsrOz9de1Wi1Wr16NOnXqoFevXpJoT05OlmwKBDAN/+VE8f8x06ZNw9mzZ7Fhwwb9B7ghUPwHJk6ciDfeeKPY2L/99hsAoFWrVuILh+K/3JTmf5Fk6uXlBUtLS5w4cUIyQQUGarVa/V3mkxQYaG1tjRdeeKHI4yqVCkuWLEFKSgrefvtt3L9/Hw8ePMDo0aNx+fJlLFq0CJaWlpJo/+9//4smTZpIEhswDf/lRPEfWLZsGT799FMcOXIEdnZ2haa7BEHA1atXJdOu+P+Yn376CdOnT8f169eRk5OD69evIzIyEitXrkSLFi0wdOhQSbQr/stLaf4XSaYWFhZo1qwZDh48KJmgkJAQqNVqBAYG6o+yPEmBmaV9K2nbti0OHjyItLQ0eHt7o379+rh8+TL27Nkj2bcZkjh8+LAk28YLMBX/N23apP/wvnPnDrRarf7/Fy9eLIluxf/HrF27VjJtpaH4/5ipU6di0aJFOHjwIIKCgmBvb48mTZpg586d+OKLL7Bv3z5J1hwV/4syYsSIYtdMpTiBUKb/xdVFmjJlCmvXrl2krNOzzp49ewiAp0+flnQcxf/iUfyXF8V/eVH8l5cy/C++Nu/Vq1cpCAJ/++03adWZGOHh4WzVqpXk4yj+F4/iv7wo/suL4r+8lOF/yS3YOnXqxG7dukmjygS5desWraysGBMTY5DxFP8Lo/gvL4r/8qL4Ly/l8L/kZLp3714CkKQ3qCkyZMgQ1q9fX/TWSiWh+F8YxX95UfyXF8V/eSmH/yUnU/Jx93J/f39mZWWJr86EOHToEM3MzPjjjz8adFzF/8co/suL4r+8KP7LSzn9Lz2Z3rx5k05OTsX2DX1WyMjIoJeXF7t37y5Jj8jSUPxX/JcbxX95UfyXlwr4X3oyJclVq1ZREASuXr1aPIUmglar5auvvkp3d3fev39fFg2K/4r/cqH4Ly+K//JSQf/LTqYkOW7cOFpYWPD333+vukITYuTIkbS0tGRCQoKsOhT/Ff/lQPFfXhT/5aWC/pcvmWq1Wg4ePJh2dnbctWtX1RSaADqdjhMmTKCZmRnXr18vtxzFf5lR/JcXxX95UfwvF+VLpiSZm5vLAQMG0MLCgqtWraqcShMgJyeHgwYNorm5ucEX/EtD8V9eFP/lRfFfXgr8Nzc3V/wvnvInU/LxN5Tx48dTEARGRkYyNze3YkqNnOvXr7N9+/a0t7fnjh075JZTBMV/eVH8lxfFf/nYtm0bg4ODqVKpFP+Lp2LJtIAlS5bQxsaGbdu25ZUrVyoTwuhYs2YNnZyc6ODgwOjoaLnllEp19t/f359nzpyRW06pKP7Li+K/YdBqtdy4cSNbtWpFAAwMDOTGjRu5ePFixf+iVC6ZkuS5c+cYEBBAKysrTp8+3WCHicXm2rVrDA0NJQC+/fbb7N+/PwVBYIcOHXj06FG55ZVIdfQ/IiKCjx49kltSuVD8lxfFf+nIyMhgdHQ069atS5VKxdDQUB45cqTQcxT/i1D5ZEo+nkefPXs2bW1t2ahRI65YscJkiiMnJSUxMjKSVlZW9PPz4+7du/WPHTt2jB07dqQgCAwLC+O1a9fkE1oK1dV/U0HxX16e9L9hw4aK/1UkMTGRUVFRdHZ2po2NDSMiInjp0qUSn6/8/heiasm0gFu3bvGtt96iWq2mt7c3f/jhB6OtmnHz5k1OmjSJtra2dHNz4zfffFPi3P/GjRvZqFEjmpubc+zYsUxNTTWw2vJRXf03FRT/5ePq1ats3Lgx69evr/hfSa5cucKxY8fSysqKrq6ujIqK4t9//13u1yu//yTFSqYFXL58mUOGDKG5uTmdnZ05btw4o5j/z83NZXx8PHv37k0zMzO6u7vzq6++YmZmZrleGxMTQ1dXV7q4uDA6Opp5eXkGUF1xqqP/poTiv2GJj4+nk5MTmzZtyitXrij+V5A//viD4eHhNDMzY8OGDRkdHV2laeYn/XdycnrW/Bc3mRZw//59fv7552zQoAEB0MfHh5MnT+axY8cMNg2Qnp7ODRs28K233qKzszMFQWBwcDDj4uKYk5NT4XgpKSmMjIykhYUFfXx8GBcXJ4FqcaiO/psSiv/Skp+fz6ioKKpUKoaHhxf5UFT8L5mCTUWBgYEEwBYtWjA2NlY0X3Q6HYcMGcLatWs/a/5Lk0wL0Gq1TEhI4Lhx41ivXj0CoIODA3v16sUvvviC27Zt4507d6o8Tl5eHs+dO8e4uDiOHz+erVq1olqtpiAIbNWqFefOncu//vqr6m+I5KVLlxgWFkYADAkJ4cmTJ0WJKwVy+69SqRgQEMD69esbtU9SYQz+BwYGivr7LzdJSUns2rUrLS0t+Z///KfU5yr+/4+cnBzGxsbS19eXgiAwNDRUkuM3kZGRNDMz488///ys+R8nkCQMxJkzZ7B3714kJCRg//79uHv3LgDA2dkZzz//PNzd3VGnTh24ubnBwcEBFhYWsLa2hoWFBTIyMpCfn4+MjAykp6fj1q1bSExMxM2bN3Hp0iXk5uZCrVbD19cXnTp1Qps2bTBt2jQ0bNgQ27ZtgyAIor6Xw4cPY/z48Thy5AgGDx6M2bNnw93dXdQxxMaQ/nfs2BEdO3aERqNB8+bN0bhxY8THx4v+92BKyOF/zZo1ZX7X4rFv3z4MGDAA1tbWWLt2LQICAir0+if937NnD5KSkgBUb/9TUlLw/fff49tvv8XDhw/xxhtvYMKECfD19RV9rGnTpmHGjBlYvnw5Bg8eXOTxav77v8agyfRpHjx4gNOnT+Ps2bO4cuUK7t+/jzt37iAxMRHp6enIyclBZmYmcnNzYWtrC41GAzs7O9jb28PT0xPu7u6oXbs2fHx84O/vDz8/P1hYWOjjHz9+HO3atcPcuXMxZswY0fWTxNq1a/HBBx8gOTkZ7733HqZMmQJbW1vRx5KC8vj/zz//IC8vr1L+F3D48GF06tQJM2fOxKRJk2R4p8bJk/7/+OOPSE1NRY0aNSr8++/l5YWZM2diypQpeOutt+R+W6JDEvPnz8ekSZPQo0cPxMbGwsnJqUox+/Tpg1u3bmHu3LmSff7Iyfnz5zFv3jysWLEC5ubmGDFiBMaOHQsPDw9JxouOjsb48eOxcOFCDB8+vFyvkfrz38CskXSa1xiYNm0aLS0teerUKcnGePToEWfNmkV7e3t6enoyJiaGWq1WsvEMybJly2hpaVnlOLNnz6Zarea+fftEUFX98Pf35/jx4yv9+p49e7JXr14iKjIO0tPTGRYWRrVazaioKFH+XV26dIkqlYq//PKLCAqNB51Oxx07djA0NJSCIPC5557jrFmz+PDhQ0nH/e677wiAX331laTjGDnSrpkaA3l5eWzXrh2bNWsm+cJ/cnIyx44dSzMzM7Zo0YJ79uyRdDxD8MsvvxBAlbeP63Q69unTh7Vr12ZSUpJI6qoHd+7coSAI/O233yodY+XKlVSr1UxMTBRRmbycO3eOvr6+dHNzE7VjyYgRI9igQQOTORNZFllZWYyNjaW/v7++UlFcXJxB3t+yZcuoUqn4+eefSz6WkVP9kyn5+CyanZ0dIyMjDTLeuXPn9FU1QkJCjGJ7eGXZvn07ATAlJaXKsVJSUtigQQMGBwdXmw8yMVi2bBnNzc35zz//VDrGP//8Q1tbWy5YsEBEZfKxfPlyWltbs2PHjrx7965ocR88eEAbGxt+9913osWUi7t37zIqKoouLi60sLBgeHi4pDNwT7N27Vqq1Wp+8sknBhvTiHk2kilJLl68mCqVyqAthHbs2MEXXniBGo2GERERJnlHdujQIQLgzZs3RYl39OhRWlhYcMaMGaLEqw4MHjyYXbp0qXKcQYMGMTAwUARF8pGdnc2xY8dSEASOHTtW9IIGn376KZ2cnJiRkSFqXENScD5UrVbT3d2dUVFRTE5ONqiGDRs2UKPRcOzYsQYd14h5dpIpSYaFhbF27dp88OCBwcbUarWMjY2lu7s7nZycOGvWLJOqY3nmzBkC4NmzZ0WLOW/ePKpUKm7fvl20mKaKTqeju7s7v/jiiyrH2rRpEwVBMNryl2Vx48YNtm7dmvb29ly7dq3o8bOzs+nu7s7JkyeLHltqcnJyGBcXx/bt2xc6HypH9aQdO3bQ0tKS77zzDnU6ncHHN1KerWSanJxMDw8P9uvXz+Bj//PPP4yKiqKVlRXr1q3L2NhYk/hFvHHjBgHw8OHDosYdNGgQa9asKco5M1PmxIkTBMDjx49XOVZeXh7d3NxMcv3q6WpGUvCf//yHFhYWok4bS01SUhJnzZrFOnXq6IvOy9me7cCBA7S1tWV4eHi12WQpEs9WMiUfrwEKgiBb491bt24xIiKCKpWKbdq04YEDB2TRUV5SUlIIQPR/wBkZGfT29manTp2e6fXT2bNns0aNGqJ9MI0aNYq+vr6ixDIEZVUzEgudTkc/Pz++/fbbksQXmwsXLnDs2LG0tramg4MDx44dy+vXr8uq6fDhw7Szs+Orr75qtCVVZeTZS6YkOWbMGDo6Osr6y2kqnWny8vIIgOvWrRM99p9//kkrK6tnegND165dOWDAANHi7d+/nwBMouJUUlISQ0JCylXNqKrEx8cbvS9arbbQ0RYvLy9GR0dXaWOaWPz55590dnZm9+7dTWqZyoA8m8n00aNHbNy4MQMDA2X/hmUKnWksLS25fPlySWJ///33VKlUVToWYqpkZWXRysqKS5YsES2mTqdjgwYN+MEHH4gWUwoSEhJYq1YtNmrUyCAJrnPnzuzRo4fk41SGjIwMxsTE6Ev9hYSEcOPGjUazDHTx4kW6u7szODjYaLvBGAHPZjIlH2+ssba2Noq7ImPvTOPm5ibpUYI333yTzs7Osk9jGZpt27aJulO6gI8//ph16tQxyjUtnU7H6OhoajQa9u7dW5QjV2Xxxx9/SLJUUVWuXbvGyMhIOjk50dLSkuHh4UZ3jO7KlSusVasW27VrZ9I7oA3As5tMSXLBggVUqVTcuXOn3FJIGm9nGl9fX06bNk2y+P/88w/9/PzYtm1bk+9oUhEmTpwoyfrmqVOnCIAHDx4UPXZVkKKaUXkYOHAgmzRpYjR3ek8ebfHw8Khw/1BDcevWLTZo0IBNmzY1yJceE+fZTqYk2b9/f3p6ehr8nFZpGFtnmo4dO3L06NGSjnHmzBna2Nhw0qRJko5jTAQEBEh2Tu/55583qqleqaoZlcWtW7eo0WgkW6YoLwVHW9q0aVPoaIsxzUA9SWJiIn18fNikSROjTPRGiJJMHz58yHr16rFnz55G8821gEOHDrFdu3b6nY737t2TRUe/fv34+uuvSz7OTz/9REEQJNnsZGzcv3+fgiAwPj5ekvgTJ05ko0aNJIldUaSqZlQexo8fT09PT9lmPBITEzlr1ix6enpSo9EwLCzM6HfwJycn09/fn15eXrJ95pggSjIlH2+GMDMzM8oSYzqdjnFxcaxfvz5tbGwYGRlp8LWLUaNGsXPnzgYZ65133qGjo6PR7m4Wi5UrV1Kj0TAtLU2S+AW7euVcg5O6mlFZpKen08HBgV9++aVBxyUfV/oKDw+nhYUFa9SowcmTJ5vEmerU1FS2bNmSdevWfeb2MFQRJZkWEBUVRQsLC544cUJuKcUiZ2eaqKgo+vn5GWSsrKwsNmvWjK1atarWW/DfeustduzYUbL4Wq2WHh4espVtlLqaUXmYM2cO7ezsJO+aUkB2djZXrFihn8oNCAjg4sWLTWYHbGZmJjt06EBPT09evXpVbjmmhpJMC9BqtQwKCqKfn59kB8fFQI7ONN999x1r1Kgh+TgFXLp0ifb29tW67mft2rUlT3QRERFs0aKFpGMUhyGqGZVFXl4e69aty3Hjxkk+1r179zhr1izWrl27UJUiY1s2Ko1Hjx4xKCiIrq6uPHfunNxyTBElmT7JrVu36OLiwoiICLmllIkhO9PExcVRpVIZdLPEzz//TACyVaqSktOnTxMAjxw5Iuk4W7ZsoSAIvHHjhqTjFGCoakbl4ccff6SZmZmkd1gFu3I1Gg3d3NwYGRlpMK/FJCcnh7169aKjoyP/+9//yi3HVFGS6dOsW7eOALhq1Sq5pZQLQ3Sm2bNnDwHw/v37oscujVGjRtHW1pbnz5836LhS8/XXX9PJyUnyMorZ2dm0t7fn/PnzJR2HNGw1o/LQunVr9u/fX/S42dnZjIuLY9u2bfW7cmNiYvjo0SPRxzIE+fn5fP3112lvb8+jR4/KLceUUZJpcYwYMUL2coMVQerONGfPniUAg/ZKJB9/cLVo0YJNmjQx2Q+r4njppZcM1mxhwIABorR3Kw1DVzMqi127donenOHOnTuMiopijRo1aG5uzrCwMO7fv1+0+HKg1Wo5ePBgWltbc+/evXLLMXWUZFocBeUG27RpY1JFBKTqTJOcnEwAshS3uH79Op2dnU1i6r085OTk0MbGhjExMQYZb/Xq1TQzM5PkHLUc1YzKQ69evdihQwdRYu3bt09faMLd3Z2RkZG8ffu2KLHlRKfTcfjw4TQ3N38mS3lKgJJMS+LixYu0t7fn+++/L7eUCiN2ZxqtVkszMzPZpr43btxIQRAYGxsry/hisnPnTgIw2NGfjIwMWlpactmyZaLGlauaUVlcuHCBKpWKv/76a6VjFNTKbdKkiey9Q6Vi4sSJ1Gg03Lhxo9xSqgtKMi2N1atXUxAE/vLLL3JLqRRidqbx9PTkV199JaK6ivH+++/TxsZG1CblcvDhhx/Sy8vLoGO+9NJL7NOnj2jx5KpmVB6GDh1KLy+vSiX3K1euMDIyks7OzrSwsGB4eLjRHpWrCh999JGsX46rKUoyLYthw4bR0dHRpM9didGZpn379hwzZowE6spHbm4uAwMD6e/vbxQtqSpLizlsRq8AACAASURBVBYtOGrUKIOO+f3339PGxkaUdXQ5qxmVRWJiIq2srLhw4cJyv6ag7VlYWBjNzMxYq1YtRkVFGVV5UTGZPn06BUHg4sWL5ZZS3VCSaVlkZWWxefPmDAgIMOlNMFXtTDNo0CD27t1bQoVlc/PmTdaoUYMDBw6UVUdl+fvvv6lSqbh+/XqDjvvXX39Vec07KytL1mpG5eGTTz6hs7Nzub5spaWlMSYmhn5+fgTAwMBAxsXFGW2tXDGYN28eBUGo0JcNhXKjJNPycPnyZTo4OEhe7N0QVLYzzccff8wmTZpIrK5stmzZQpVKZZLfrFetWkW1Wi1Lz9qqFL43hmpGZZGZmckaNWpw6tSppT7v4sWLHDt2LG1tbWlra8uIiAiePn3aQCrlY8mSJRQEgbNnz5ZbSnVFSablJS4ujgC4cuVKuaWIQkU708TExNDOzs5A6krnww8/pKWlpckdMH/nnXcYGBgoy9hjxoxhQEBAhV9nDNWMysOCBQtoYWFRbGH2gqnc0NBQCoLARo0acdasWXzw4IEMSg3P8uXLqVKpOHPmTLmlVGeUZFoRRo8eXe2KCBw6dIjt27cvszNNQSNrY/gAys/PZ3BwML28vCQrFC8FdevWlbQvbGls2rSJgiCUe53TmKoZlYVOp6OPjw+HDRtW6Hpqaiqjo6NZv359qlQqhoSEMC4uTvJiGcbEunXrqFarTfJUgomhJNOKkJuby3bt2lW7IgLl6Uxz8eJFAuDx48dlUlmY+/fv08PDwyCt4cTg/PnzBCBb+63MzExaWFiU63iRsVUzKov169dTEAT9Tu8//viD77zzDq2srOjo6Mj333/fqO+qpWLr1q20sLCQdePgM4SSTCvKjRs3qlURgScprTNNdnY2VSqVUR0T2rVrF83MzPjvf/9bbillMn/+fNrb28u6cSc4OJiDBw8u9TnGVs2oPLz44ovs2bMnY2Nj9R1bmjRpwu+//96kd35Xhd9//52WlpYcMmSISRXcN2GUZFoZ4uPjq00RgeIoqTONh4cH586dK7O6whS0zvvjjz/kllIqvXv3FvWsZ2WYMWMGa9euXexjT1Yzevnllw3WtqyqbNmyhQDo6OioL/Nnah1bxObgwYO0tbVlv379nqkpbZlRkmllqS5FBErj6c40AQEBRtcWTavVslu3bqxXr55RrOcWR15eHu3t7WW/g963bx8BFJnyTE9PZ79+/fTVjIw9ET15NlQQBGo0GkZGRvLmzZtyS5OdEydO0MnJiX369KnWx3yMECWZVpbc3Fy2bduWfn5+RdYXqxsFnWlUKhXr1asnSWeaqpCYmEhPT0+GhoYaZSLYu3cvAfDy5cuy6iioC/zksaKTJ0+yUaNGRlnN6GlSU1MZExNDX19fAmDLli1pZmbGFStWyC3NKDh16hRdXFzYtWtXURtdKJSLOBUUKoVGo8G6devw8OFDhIeHg6TckiQjJCQEJ06cQM+ePXHnzh14e3vjyy+/RE5OjtzSAABubm5Ys2YNtm3bhujoaFm1nD59GqmpqYWu7dixA/Xr10ejRo1kUvUYc3NztG3bFnv37gUArFixAu3bt0etWrVw8uRJBAcHy6qvJI4fP47hw4ejVq1amDRpEjp06IDTp08jMDAQHh4e6N+/v9wSZefy5cvo3r07fH19sX79elhYWMgt6dlD7nRu6uzfv58ajYZffvml3FIkZ/HixbSxseHUqVNF70wjBp9//jk1Go2srbGGDRtGlUrFFi1a8JNPPmFCQgJbt25tNBvWpk+fTk9PT6OvZlTQNzQwMJAA6OPjw+joaP0sUFpaGu3t7WWtF20s3Lhxg/Xq1WPbtm2Znp4ut5xnFWWaVwzmzp1LlUpV7VsZ7d+/nwB448YN0TvTiIFOp+Mrr7zCOnXqlFhbNSsrS1INH374IdVqNQHo/2tubs727dvz22+/5YULFyQdvyzWrl1LALS1tTXKakYFxeaf7Bu6Y8eOIs+bNWsW7ezsZKkmZUzcvn2bDRs2ZEBAgNG0wHtGUZKpWLz11lt0dnY2WGstOXjw4AEBcOvWrfprYnamEYOUlBTWr1+fL730UqHOIXl5efzggw84fPhwScefPXs2LSwsCKDQj0ql0idXDw8PRkREGLxXbkE1I0EQjGpX9tPF5j08PBgZGclbt24V+/zc3FzWqVOHEydONLBS4yIpKYm+vr709vbm/fv35ZbzrKMkU7F49OgRmzdvzqZNmxp1tZiq4ubmxujo6CLXxehMIxZHjhyhubk5P//8c5KPv723a9eOAOjk5CTpcYHFixfrk2ZpPx9//LFkGp7m6WpGLVu2NIqD/A8fPmR0dDQbNGhQoWLzsbGxVKvVvHHjhoGUGh8PHz5ks2bN2KhRI6Pr3vOMoiRTMfnrr7/o4uLCN954Q24pktGxY8cS7+6q2plGTL7++muamZnxq6++oouLCzUajT6R7d27V7Jx161bV2oS1Wg09Pf3N9hdaXHVjMaMGcNWrVoZZPzi+OOPPxgREUFra2va29szIiKCZ86cKffrmzZtykGDBkmo0LhJS0tjq1atWKdOHf71119yy1F4jJJMxWb79u0mU5WnMgwfPpydOnUq9TmV7UwjJlqtlq1bt6YgCFSpVIWS2b/+9S/Jxi04BlNaMv3zzz8lG/9JSqpmtHLlSmo0GoOWxCzYUNS+fXsCoK+vL6OjoytcoWj79u0EwCNHjkik1LjJzMxkx44dWbNmTdnX3xUKoSRTKfj000+p0WiYkJAgtxTRmTdvHmvUqFGu5xZ0phEEoVydacQiKSmJXbp0KZREn/ypWbOmZDuQT58+XWIiValUorXAunTpUomPlVXN6MqVKwTAgwcPiqKlNAo2FLm4uJS6oai8dO/enUFBQSIqNB1ycnLYo0cPurq6VutiMSaKkkylQKfT8dVXX6W7uztv374ttxxR2bNnDwFU6H2VtzONGOzdu5eurq5lrltKdWdz586dEu9I27RpI8p67f79+2lra1tsH860tLQyqxnpdDq6urrym2++qbKW4sjPz+eGDRvYvXt3faGPzz//nImJiVWKe/r0aQqCwE2bNomk1HTIzc1laGgoHRwcjKbZhEIhlGQqFenp6fT19WW7du0MvmtTSh4+fEhBELh58+YKva48nWmqysGDB6lWqykIQqmJ1NzcnJGRkaKOXUB2dnaxY1paWopSASkrK4sNGzYkADZs2LDQucKKVDPq0aMHw8PDq6znSe7du8cZM2awbt26FASB3bp146+//irahq8hQ4bQ29u70C7tZ4H8/HwOGDCANjY23Ldvn9xyFIpHSaZScv78edrb2xvFzkkxqVevHj/77LNKvba0zjRisH37dnp6ehbacFTcT7169UQb82ksLS0LjSUIgmit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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model.view_model(layout=\"dot\")\n",
    "from IPython.display import Image, display\n",
    "display(Image(filename=\"causal_model.png\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In general, you can specify a causal graph that describes the mechanisms of the data-generating process for a given dataset. Each arrow in the graph denotes a causal mechanism: \"A->B\" implies that the variable A causes variable B.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# I. Create a causal model from the data and given graph.\n",
    "model = CausalModel(\n",
    "    data=data[\"df\"],\n",
    "    treatment=data[\"treatment_name\"][0],\n",
    "    outcome=data[\"outcome_name\"][0],\n",
    "    graph=data[\"gml_graph\"])\n",
    "model.view_model(layout=\"dot\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**II. Identification**\n",
    "\n",
    "Both ways of providing domain knowledge (either through named variable sets of confounders and instrumental variables, or through a causal graph) correspond to an underlying causal graph. Given a causal graph and a target quantity (e.g., effect of A on B), the process of identifcation is to check whether the target quantity can be estimated given the observed variables. Importantly, identification only considers the names of variables that are available in the observed data; it does not need access to the data itself. Related to the two kinds of variables above, there are two main identification methods for causal inference. \n",
    "\n",
    "1. **Backdoor criterion** (or more generally, adjustment sets): If all common causes of the action A and the outcome Y are observed, then the backdoor criterion implies that the causal effect can be identified by conditioning on all the common causes. This is a simplified definition (refer to Chapter 3 of the CausalML book for a formal definition).\n",
    "$$ E[Y│do(A=a)] = E_W E[Y|A=a, W=w]$$\n",
    "       \n",
    "where $W$ refers to the set of common causes (confounders) of $A$ and $Y$. \n",
    "\n",
    "2. **Instrumental variable (IV) identification**: If there is an instrumental variable available, then we can estimate effect even when any (or none) of the common causes of action and outcome are unobserved. The IV identification utilizes the fact that the instrument only affects the action directly, so the effect of the instrument on the outcome can be broken up into two sequential parts: the effect of the instrument on the action and the effect of the action on the treatment. It then relies on estimating the effect of the instrument on the action and the outcome to estimate the effect of the action on the outcome. For a binary instrument, the effect estimate is given by,\n",
    "    \n",
    " $$ E[Y│do(A=1)] -E[Y│do(A=0)]  =\\frac{E[Y│Z=1]- E[Y│Z=0]}{E[A│Z=1]- E[A│Z=0]} $$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Estimand type: nonparametric-ate\n",
      "\n",
      "### Estimand : 1\n",
      "Estimand name: backdoor\n",
      "Estimand expression:\n",
      "  d                                 \n",
      "─────(Expectation(y|W0,W2,W1,W3,W4))\n",
      "d[v₀]                               \n",
      "Estimand assumption 1, Unconfoundedness: If U→{v0} and U→y then P(y|v0,W0,W2,W1,W3,W4,U) = P(y|v0,W0,W2,W1,W3,W4)\n",
      "\n",
      "### Estimand : 2\n",
      "Estimand name: iv\n",
      "Estimand expression:\n",
      "Expectation(Derivative(y, [Z0, Z1])*Derivative([v0], [Z0, Z1])**(-1))\n",
      "Estimand assumption 1, As-if-random: If U→→y then ¬(U →→{Z0,Z1})\n",
      "Estimand assumption 2, Exclusion: If we remove {Z0,Z1}→{v0}, then ¬({Z0,Z1}→y)\n",
      "\n",
      "### Estimand : 3\n",
      "Estimand name: frontdoor\n",
      "No such variable found!\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# II. Identify causal effect and return target estimands\n",
    "identified_estimand = model.identify_effect(proceed_when_unidentifiable=True)\n",
    "print(identified_estimand)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**III. Estimation**\n",
    "\n",
    "As the name suggests, the estimation step involves building a statistical estimator that can compute the target estimand identified in the previous step. Many estimators have been proposed for causal inference. DoWhy implements a few of the standard estimators while EconML implements a powerful set of estimators that use machine learning.   \n",
    "\n",
    "We show an example of using Propensity Score Stratification using DoWhy, and a machine learning-based method called Double-ML using EconML."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "*** Causal Estimate ***\n",
      "\n",
      "## Identified estimand\n",
      "Estimand type: nonparametric-ate\n",
      "\n",
      "### Estimand : 1\n",
      "Estimand name: backdoor\n",
      "Estimand expression:\n",
      "  d                                 \n",
      "─────(Expectation(y|W0,W2,W1,W3,W4))\n",
      "d[v₀]                               \n",
      "Estimand assumption 1, Unconfoundedness: If U→{v0} and U→y then P(y|v0,W0,W2,W1,W3,W4,U) = P(y|v0,W0,W2,W1,W3,W4)\n",
      "\n",
      "## Realized estimand\n",
      "b: y~v0+W0+W2+W1+W3+W4\n",
      "Target units: ate\n",
      "\n",
      "## Estimate\n",
      "Mean value: 10.014616535147312\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# III. Estimate the target estimand using a statistical method.\n",
    "propensity_strat_estimate = model.estimate_effect(identified_estimand,\n",
    "                                 method_name=\"backdoor.dowhy.propensity_score_stratification\")\n",
    "\n",
    "print(propensity_strat_estimate)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "*** Causal Estimate ***\n",
      "\n",
      "## Identified estimand\n",
      "Estimand type: nonparametric-ate\n",
      "\n",
      "### Estimand : 1\n",
      "Estimand name: backdoor\n",
      "Estimand expression:\n",
      "  d                                 \n",
      "─────(Expectation(y|W0,W2,W1,W3,W4))\n",
      "d[v₀]                               \n",
      "Estimand assumption 1, Unconfoundedness: If U→{v0} and U→y then P(y|v0,W0,W2,W1,W3,W4,U) = P(y|v0,W0,W2,W1,W3,W4)\n",
      "\n",
      "## Realized estimand\n",
      "b: y~v0+W0+W2+W1+W3+W4 | \n",
      "Target units: ate\n",
      "\n",
      "## Estimate\n",
      "Mean value: 10.023701526335056\n",
      "Effect estimates: [10.02370153 10.02370153 10.02370153 ... 10.02370153 10.02370153\n",
      " 10.02370153]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "import econml\n",
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "from sklearn.linear_model import LassoCV\n",
    "from sklearn.ensemble import GradientBoostingRegressor\n",
    "dml_estimate = model.estimate_effect(identified_estimand, \n",
    "                                    method_name=\"backdoor.econml.dml.DML\",\n",
    "                                    method_params={\n",
    "                                        'init_params': {'model_y':GradientBoostingRegressor(),\n",
    "                                                        'model_t': GradientBoostingRegressor(),\n",
    "                                                        'model_final':LassoCV(fit_intercept=False), },\n",
    "                                        'fit_params': {}\n",
    "                                     })\n",
    "print(dml_estimate)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**IV. Refutation**\n",
    "\n",
    "Finally, checking robustness of the estimate is probably the most important step of a causal analysis. We obtained an estimate using Steps 1-3, but each step may have made certain assumptions that may not be true. Absent of a proper validation \"test\" set, this step relies on *refutation* tests that seek to refute the correctness of an obtained estimate using properties of a good estimator. For example, a refutation test (`placebo_treatment_refuter`) checks whether the estimator returns an estimate value of 0 when the action variable is replaced by a random variable, independent of all other variables.   "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Refute: Use a Placebo Treatment\n",
      "Estimated effect:10.014616535147312\n",
      "New effect:-0.001240824909823009\n",
      "p value:0.45\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# IV. Refute the obtained estimate using multiple robustness checks.\n",
    "refute_results = model.refute_estimate(identified_estimand, propensity_strat_estimate,\n",
    "                                       method_name=\"placebo_treatment_refuter\")\n",
    "print(refute_results)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### The DoWhy+EconML solution\n",
    "We will use the DoWhy+EconML libraries for causal inference. DoWhy provides a general API for the four steps and EconML provides advanced estimators for the Estimation step.  \n",
    "\n",
    "DoWhy allows you to visualize, formalize, and test the assumptions they are making, so that you can better understand the analysis and avoid reaching incorrect conclusions. It does so by focusing on assumptions explicitly and introducing automated checks on validity of assumptions to the extent possible. As you will see, the power of DoWhy is that it provides a formal causal framework to encode domain knowledge and it can run automated robustness checks to validate the causal estimate from any estimator method.\n",
    "\n",
    "Additionally, as data becomes high-dimensional, we need specialized methods that can handle known confounding. Here we use EconML that implements many of the state-of-the-art causal estimation approaches.  This package has a common API for all the techniques, and each technique is implemented as a sequence of machine learning tasks allowing for the use of any existing machine learning software to solve these subtasks, allowing you to plug-in the ML models that you are already familiar with rather than learning a new toolkit.  The power of EconML is that you can now implement the state-of-the-art in causal inference just as easily as you can run a linear regression or a random forest.\n",
    "\n",
    "Together, DoWhy+EconML make answering what if questions a whole lot easier by providing a state-of-the-art, end-to-end framework for causal inference, including the latest causal estimation and automated robustness procedures. \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### A mystery dataset: Can you find out if if there is a causal effect?\n",
    "To walk-through the four steps, let us consider the **Mystery Dataset** problem. Suppose you are given some data with treatment and outcome. Can you determine whether the treatment causes the outcome, or the correlation is purely due to another common cause?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import math\n",
    "import dowhy.datasets, dowhy.plotter"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Below we create a dataset where the true causal effect is decided by random variable. It can be either 0 or 1. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   Treatment    Outcome        w0         s        w1\n",
      "0  12.630846  24.623801 -2.580494  0.434753 -1.347023\n",
      "1  10.746278  20.853413  2.111399  1.625736 -0.569495\n",
      "2  21.689118  42.446524 -3.925405  7.273121 -1.034146\n",
      "3  21.720635  42.706588  3.999241  2.972445 -2.468980\n",
      "4  10.409912  20.036106  2.067560  1.609878 -1.512199\n"
     ]
    },
    {
     "data": {
      "image/png": "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Y3V1teexxx7b7H+surraE/j1ySefrAl+PgD41a9+1bu5uVk8++yzGzdt2rR806ZNyx9++OHvMzIy5LZt2zInTpxYfMsttxy1aNGivLKysqoVK1b81+v1Vr711lvrioqKmlpaWsStt97as6Ghoc2FzoIFC9qNHTv2mNra2vTjjz9+/2uvvbZ+w4YNy7du3Vr54YcfrjrnnHOqW1tbMWnSpB4zZswwve22ePHijo8++mjxRRddtPuzzz77buvWrZVLlixZefHFF+8GgCVLlnR44oknDssVX7Vq1colS5YcnFE/derUtcGvieUvW4NOHfslAI4DUCCEEBbBvb+aTeDV0jcB348A8InJviN8/9YD+Fajb5Hp1St0BQMAmDkTmDw5al0hIqIE12ox19Hj2Od3ynpz8ebO5XO+7dnQ3JoGANtrG7LK53zbEwDGn9wzZSrI7Nu3L71v3771X3311arA0fZjjjmmCQAeeuihritWrGjfqVOnlgULFnw3ZMiQg6PqRUVFLYMHD9560kkn7b/00kv7z5kzp/Onn3667ayzzjrgbzNixIi6L7/8cm3w83bv3r3lxBNPrL/66qt3Dx48+Lhvv/223bvvvtuxtLS0FjAuCDp16tSanZ19ME5UnQBcW1ub/p///OfbAQMGHFxcaNKkSTu2bduW+f/+3/87Yt68eZ0B4I033lg3bty4g3Hm//zP/+zNzc3deOmll/bfvn175uzZsztefvnlNf7tra2t+NWvftWrqalJnHPOOdXvv//++oyMQyHwueeeu//cc89df+mll/aqqKjoMmnSpKMvu+yylWlpbce/t2zZknX11VfveP3117/3P9atW7eWioqKjUOGDMlZuXJlu7feeqtw0qRJB0f9O3bs2NqhQ4eDr0G7du1cmxStU8fevypsewDDQzUQQmTjUHBe6X9cSrkBhwL1y032zcChvPyPpZQHQrVzhdUy3/VWRXyIiIgomv728dpif1Dv19Dcmva3j9cWx6pPsXLvvfdWmQWIL730UlcAuOWWW7yBQX2g0tLS2pNPPrkWAN544w2tMuM9evRoPvXUU2sAYP78+RYTS9Rdf/312wODer/x48fvBowAfdiwYfsCg3q/Sy65pDY/P78ZABYvXhxYjRFz5szpuHbt2tz09HS8/PLL3wcG9YEef/zxKgBYt25dzuLFi0Pm2+fm5rY+/fTTPwY/npaWhrFjx+4CgFWrVuWGumsQDToj9vNgLCDVG0C5EOIXvhSdQHcCKPB9/6+gbc/BmFx7ghBitJTy7aDttwPoGtA2eqxGV4iIiFR5vbHuQdLbUdsQsuKF2ePJSgiBSy+9tCbUthUrVmR7vd4sADj77LNr9+7dazqQe+yxx9YtXry447Jly9oFb2tpacFLL73Uefr06QUrV65st2fPnsxQAeu6deusCqMou+CCC0Lmxg8cOPDghclZZ50Vsk1aWhqOPvrohurq6oytW7celuDuv/Do169fXX5+fovZ61FUVNRSUFDQvGfPnozFixe3P+WUU+qC25SUlOzv3LlzyMCxf//+DQDQ3Nwsdu7cmV5cXGwx4cYdyoG9b2Ls7wDMBHAegDlCiD/j8Dr2E33NlwJ4PegQ/wTwawCDALwhhOgGoAJAJoBrAPzJ126+lNJkPW6XZGUBjW0uEA2jRoV+nIiIKJhVOcvs7Oj1I4kVdcxu3B4iiC/qmG3yQZ6cCgoKms1G6//73/8eDLTPPvvsn6gcb9euXYcFw3v27Enz5+iH2zd4MqpdZoFwhw4dDqb1dO/e3TRYzsnJkYAx4Tbw8bVr12YDxkh6fn7+UJW+7NixI2SM3LVrV9OV5tq3b3/w97F//36drBjHaD2plHIWjJH1ZgAXAFgEYDeA7wD8HoCAkYIzSkrZFLRvI4CLAWyAUdbyWQBVADbBWOgqHcYFwVib/xf7+vUz3zZrlvk2IiKiQAsWmG+78sro9SOJ3XpOv6rsjLTDAtrsjLTWW8/pVxWrPsVCTk6OabpBdXW1dqDd1NR02Ej8r3/966OXLFnSQQiBsWPH7pwxY8baVatWrdi+fXulf8Knf8Joc3OzI2knGRkZVsVZAADp6elh2wRPA62pqdF+PRoaGkLGyCrPH6oP0aKTigMAkFL+TQjxbwC3ATgTQHcABwCsgJF+85IviA+170YhRAmA38HIte8DoAVGxZ23APw9+IIgKtavN98Wo18MERElIKtiDGYr0pIW/wTZv328tnhHbUNWUcfsxlvP6VeVShNnw+nYsePBoP+7775bMXDgQK27GTU1NWkVFRVdAOA3v/nN1meeeSbkRdOBAwdiMiqtyz+SPnz48H3/+c9/old1MQa0A3sAkFJ+AyN9xs6+tQD+7PuKD3V1wIABwJoQ1Zd6W1XnJCIiCmBVjCHdkWwFghHcM5A358/1BoDVq1dn6wb2y5cvz/HXxh83bpzp67xmzRrTBZ3iSa9evRoA4Icffkj6fLiEuNKKinXrQj++tk2lJyIiotCsijEcdVT0+kEpbfjw4XWFhYVNADB16lTtGv/19fUHU2taWlpCptl8+umn7awC5czMzIMpD81Wi7ZFwXnnnVcDANu2bcv86KOP2odr74asrKyDr4fVar+RYmDvZ1L6yPRxIiKiYIMGmT/OGvYUJWlpaZgwYcI2AJg2bVrh1KlTO1m13717d9rmzZsPTp7t16/fwRH+mTNnttm3trY27ZZbbmmzqFWgoqKig9F84LFj4dJLL6055phj6gHg5ptv7rlt2zbL22fLli1zfGS/sLCwRQjjGqmqqsq114OBvZ/Z1ZOLV1VERJRkhg0L/fjwkMu/ELnm3nvv3T506ND9LS0tuOqqq4656qqrerz//vsdqqqqMnbs2JG+fPny7MmTJxdcccUVPXv27Dnkk08+OVj9pmfPnk0nnHDCPgB45plnjigrK+v+3//+N3vLli0ZU6dO7TRixIgB3333XbtevXqZLvZz0kknHfAv8HT33XcfuW7dusyGhgbR1NQU9RH89PR0vPLKKxuzs7Pl2rVrc48//vhBDz74YNdvvvkmZ8eOHek//PBDxueff97ukUceKTr55JP7n3LKKcc63YeOHTu29u7dux4AXnjhha5ff/117r59+0RTUxOampybXsrhaL+cnNDLgOcmRPoYERHFg4qK0I/PnAm8+mo0e0IpLicnR3744Ydrx4wZ0/uzzz7r9NZbbxW99dZbRWbts7KyDssje/755zefc845A2tra9P/8pe/FP/lL385uACYEAJ/+tOfflyxYkXupk2bQtaw79GjR/MFF1ywZ+7cuQXTpk0rnDZtWqF/24knnrjv66+/juok1tNOO+1ARUXFmquvvrrPtm3bMv/4xz8e/cc//jFk27y8PFdGdSdMmLD9rrvu6rF8+fL2I0aMOOziQUq51Inn4Ii9X6igHgD27YtuP4iIKHHV1uo9TuSiwsLClk8//XTdO++8s/aSSy7ZXVxc3JiTk9OakZEhCwsLm0488cR9t956q3fhwoXfXnXVVYct/HTiiSfWL1q06LvS0tJdhYWFTRkZGbKoqKjpZz/7WfW777675v77798W7vmnTZu2ceLEiVv69+9fZ1WeM1rOP//8fevXr//vn//85x9OPvnk2s6dOzenp6fLnJyc1p49ezacd955ex577LHNa9asWeHG8//hD3/Y8fe//33jsGHD9nXs2LHFf0fDSSJWdTadMHz4cLlkyRJnDiYsSrAm8GtERERRFIXPEiHEUillTHJ7li1btun444/fGYvnJiLDsmXLCo8//vheobZxxF7F1q2x7gERERERkSUG9n4ffhj68fR06yXCiYiI/Mxurbtwy52IKBjfafzGjg39eEsL8OWX0e0LERElppyQ8whZiIGIooKBvV91dejHhWDtYSIiUnPgQOjHzQo0EBE5iIG9X2urMbFpy5ZDk5+EMH4mIiIiIopzDOyDlZUdqlwgpfEzERGRissvD/34FVdEtx9ElJIY2AfyeoE33jj8sddfZ1UcIiJSY7ZA1axZUe0GEaUmBvaBAkfr/ThqT0REqpqbQz9uVd+eiMghDOwDmY2ocKSFiIjC+de/Qj8+fTpQVxfdvhBRSmJgH8isasG+fdHtBxERJZ5f/jL04+PGRbcfRJSyGNgHMruFavY4ERGRX1OT3uNERA5jYE9EROSE7Gy9x4mIHMbAnoiIyAk9e4Z+vFevqHaDiFIXA3tVLHlJRERW1q0L/fjatdHtBxGlLAb2gdLTzbeVl0evH0RElHjMPkMyMqLbDyJKWQzsA+XlmW/7+OPo9YOIiBKP2STZxsbo9oOIUhYD+0DBi1OpbiMiotTm9ca6B0REDOwPY7WACHMkiYjIDNM1iSgOMPEvkFW9+szM6PWDiIgSy4IFse4BJYmFCxfmvvrqq10WLFiQt3379sz9+/enFxQUNPfp06f+/PPPr7755pt3FRUVtcS6nxSfOGIfaPBg821cYISIiMycfnqse0AJrra2Nm306NG9TjvttGNfeumlbmvWrMmtrq7OaGpqEtu3b89cvHhxx/vvv//o/v37H/f3v/+9i1v9+Nvf/tZFCDFMCDHMrecg9zCwDzRvnvk2IaLXDyIiSixWI/b8/KAwdu3alX7aaaf1f+edd7pIKTFkyJD9zz333MaVK1eu8Hq9lYsXL/62rKysqlOnTi3V1dUZt9xyS6977rmne6z7TfGHqTiBrHIkrUphEhFRahs2DFi5MvQ2pnJSGNdee22PZcuWtQeA66+/ftsLL7zwY3pA3NG9e/e6ESNG1N100007zznnnAHr1q3LeeSRR4pPOOGEA6NHj66JWccp7nDEPtCiRebbmIpDRERm3n7bfFv79tHrByWct99+O2/OnDmdAeCss87a+9JLLx0W1Afq0aNH83vvvbemXbt2rVJK3HLLLT2bGJ9QAAb2gTwe81umvJVKRERm9u8331ZdHbVuUOJ5+umnuwGAEALPPPPMD+HaH3PMMU0TJkzYBgBerzdr8uTJBf5tq1evzvLnx8+ZM6ej2TFGjx7dSwgx7KSTThoQvO9tt93Wy/+Y/1j+r8D2gWbOnJl3ySWX9C4uLh6ck5NzQqdOnUr69+9/7OjRo3vNmDHDdJGgV199Nf/ss88+prCw8PisrKwTOnfufPxPf/rTfv/4xz86t7a2htwn+P944MABcdddd3Xv37//sbm5uUMLCwuPP//88/ssXbo0J3C/l156qeCkk04aUFBQcHxubu7QkpKSga+99lq+Wd/8ampq0u67775uw4YNG1BQUHB8VlbWCV27dh3yi1/8os/777/fIdz+0cZUnGC//jXwwgtA4AmVlmY8TkREpMskQCHas2dP2qJFi/IA4MQTT6wdNGhQg8p+N910086nnnrqCACYNWtWwY033rjHzX6aqampSRszZkzvDz/8MD/w8YaGhvSamprctWvX5vrmDSwN3H7gwAExatSoPh999NFh++3Zsydj4cKFeQsXLsx78803C+fOnbuuoKDA9A+ouro6ffjw4QO/++67dv7H6uvr0z744IOChQsX5r3//vurR44cWTdu3LieU6dOLQzcd9myZe2vvfbavjt27Nh8xx137Ax1/C+//DL3sssu67dt27bD8ul27NiR+d577xW89957BTfffPPWZ599tircaxUtHLEPtmBB2zfh1lbg889j0x8iIop/gwbpPU6R27w5EyeeOADff5+wg5SfffZZh5YWo3Llqaeeuk91v379+jUeccQRjQCwZMkSR0aN+/Xr11hdXe157LHHNvsfq66u9gR+ffLJJ2v821pbW3HJJZf08Qf1P//5z6tnzZq15vvvv19WVVW17KOPPlp1xx13bDnyyCPbLL187bXX9vAH9RdddNHuzz///Duv11v55Zdffjt27NidALBo0aKOY8aM6W3V57vuuuvoH3/8Mfvhhx/+fs2aNSuqqqqWPffccxs7dOjQsm/fvvTf/va3PR966KGu06dPL5wwYcK2JUuWrNy6dWvlvHnzVvft27ceAP70pz8d7fV625xDa9asybrgggsGbNu2LbNPnz71zz777MbVq1ev2L59e+UXX3zx3RVXXLETAP7xj390f/zxxwuD94+VhP1jcI3ZBKjhw6PfFyIiSgzr1uk9TpG7554jsHRpB9xzz5F4443vY90dO9avX5/l//4nP/mJxSqZbR1zzDH1Xq83a/v27ZlNTU3IjHCSdlpaGjp16tSanZ0t/Y916tTJdLT8+eef7/z55593AoDbb7/d+9RTT20J3H7kkUc2n3POOfsffvjhw5Zl/uKLL9pNnz69EACuvPLKnf/3f/938EKie/fudSNHjtxcUFDQ/Pzzz3f/+OOP82fMmJF3+eWXh5wgvH379syPPvpo1RlnnHHA/9ivf/3r3fX19eJ3v/tdr8rKyvYrVqxo9+c///mHe+65Z7u/zQUXXLDvnXfeWVdSUnJcXV1d2htvvFHwhz/8YUfgsSdMmNCjpqYmffDgwfsXLly4pmPHjgdfi6KiogM//elPN3fv3r3pb3/72xEPP/xw8U033bSrQ4cOEjHGEftgM2eGfvydd6LbDyIiShwXXxz68VGjotuPVLF5cyZmzCiElMD06YWJOmq/Z8+eg/3u3Lmz1qJTnTp1Oriq5vbt26P+/3/++ee7AkC/fv3qnnjiiS1m7YIvOP75z38WAkBOTk7r3//+9x9D7fPkk09u6dy5czMAvPzyy6aj4RdffPHuwKDe75prrtkjfHMju3fv3jRp0qTtwW2GDBnScOyxxx4AgP/85z+HzXBfuXJltv+i5Zlnnvk+MKgP9NBDD3lzc3Nbq6urM2bOnNnJrJ/RxMA+2D6TO2FmjxMREZkNCllVyyH77rnniINps62twD33HBnbDsWW2URTt+zevTtt5cqV7QHg8ssv321WxSeUr7/+ugMAnHLKKTVdunQJeTGTm5srf/azn1UDwH/+8x/TScDnnntuyJH8goKC1oKCgmYA+OlPf1qTlhY63O3Zs2cD0PbC6P333+8opUSnTp1aSkpK6vfu3ZsW6qulpUX06dOn3tfPdqGeI9oS8grXVdLkLorZ40RERC0mg61mj5N9/tH6piZjSLapSWD69EI89NAW9OjRHGbvuOIPPgFg9+7dWgvm7N2792AM17Vr16ieaGvXrs32X0yUlJS0GTG3smXLliwAGDhwYL1Vu2OPPbYOAHbt2pVRX18vcnJy2gRiRx55pGmtz5ycnFYA6NatW9g29fX1h0X+q1evzgGAvXv3pufn5w+16qffzp0742LBCo7YB8vONt+2dWv0+kFERERtBY7W+yXoqH2fPn0OTixdtWpVjlXbYOvXr88BgK5duzYF5sVHw969ew/Gj1Z5+KHU1dWlA0CHDh0sL0YC01+qq6tDxqsqdwpU2kgpD6tpXlNTo70qaUNDQ1zUReeIfbDrrgOefz70CP2kScDkydHvExERxbesLKCxTfEP43Fy1pIl7Q+O1vs1NQkE5UkngjPPPHNfeno6WlpasHDhwo4AvGF3ArBu3bpM/8j38OHDD+YKC8U1d5qbmyMKQgOD+cAgX0Vubm7Lvn370vft22cZPO/bt+/gcfPz86Oaa9S+fftWADjiiCMat2zZsiKazx0pjtgHW7TIPO1m1qzo9oWIiBIDU3GiZ9Wq7yDl0jZfq1Z9F+uu6ercuXPriBEjagAjl3zVqlVKV4IvvPDCwQmlo0aNOljDPjc392AAfODAAdPgffv27RGljfTr16/BPxK+bNkyrdzy4uLiRuBQuouZb7/9NhcACgsLm0Kl4bipT58+DYBRr37fvn1xMRKvioF9MI8H6NIl9DaNySFERJRC8vNDPz54cFS7QYnntttu2wYYE2B/+9vfHh2u/caNGzOfe+657oAxovy///u/BwP7rl27tmRkZEgAWLNmTcjAeffu3WnLli0zvbuRmZl5MIhubg49ZaFz586txx133H4AmD59uukqsaGcdNJJ+wDgyy+/zNu9e3fIOLSurk7469wH3pGIlgsuuKAGMO5sTJkypSBc+3jCwD6U7t1DP96tW3T7QURE8c/rBWpCFucA/vrX6PaFEs4VV1xRc8EFF+wBgI8//jh/woQJR7WY3OmpqqrKOP/88/vt378/TQiBZ555ZnNgOcns7Gw5cODAOsA84P79739fXFdXZxr/FRUVHYzmN2/ebDqyP2HChO0AsHbt2ty77rrrCLN2TU2Hz1298cYbdwJAXV1d2q233npUqH3uuOOOI3ft2pUBANdff33IVWHddMIJJ9SffvrpewHgj3/841GrV6+2vJOyevXqrLq6urgY2WdgH8qwYaEf5yJVREQUrLwcaDIpvHH55dHtCyWk119/ffNxxx13AAD++c9/dhs2bNjAF154ofOqVauytm7dmv7111/n3n333d2PO+64QWvWrMkFgEmTJlWNHj26zRXluHHjdgLA8uXL21922WW9v/nmm5wdO3akL1iwoF1paWnv1157ras/HSaUk0466YC/POTdd9995Lp16zIbGhpEU1PTYSP4EyZM2H3GGWfsBYAnnnjiyF/84hd9Zs+e3bGqqirD6/VmfP755+0mTZrUvXfv3ofdtvrpT396YMyYMTsBYMqUKUWjRo3q/cUXX7Tbtm1b+ldffZU7bty4nv/4xz+6A8DZZ59dbbY4ldtefPHF7/Pz85t37NiROWLEiGPvuuuu7osWLcrdtm1b+pYtWzIWLVqU+9RTTxWeffbZxwwaNGhwdXV1XKR1CJnAZRyHDx8ulyxZ4vyBCwuBXbtCP75jR9vHiYgodR13XOgVy/0c/pwVQiyVUsZkpGnZsmWbjj/++KiPoKaCvXv3pl1zzTU933333c5WsVmnTp1aysvLf7jllltCBCrGCPkpp5wyYMmSJR2CtwkhcM899/z47bff5r7zzjtdTjzxxH1ff/316uB2F110UZ+5c+e2SUEJbl9TU5N26aWX9v7kk0/yrf5vUsqlgT8fOHBAjBo1qo8/3SaUkSNH1s6dO3ddQUHBYbcdVq9enTVw4MDBADB79uw1F110UW2o/YuLiwdv2bIl63e/+533ySefDLmA1ujRo3tZvQ5Lly7NGT169DGbN2+2KJloVN7xer2VRUVFUZlUs2zZssLjjz++V6htHLEPxSzHvnPn6PaDiIji3+mnm28bNCh6/aCE1qlTp9aKioqNCxYs+O66667b3q9fv7q8vLyWzMxMWVRU1DRixIja++6778e1a9euMAvqAWOl108//XTNHXfcsaVPnz71WVlZMj8/v/m0006rmTlz5pry8vJt4foybdq0jRMnTtzSv3//On+t91Dy8vJaP/744/VvvfXWuvPOO29P165dmzIzM2V+fn5z//7968aPH7/j/fffbxMwt2vXTs6fP3/95MmT15955pl7u3Tp0pyRkSELCgqaTznllJpnn31247///e81wUF9tA0bNqx+1apVK5966qlNZ5555t6ioqKmzMxMmZ2dLY888sjGs846a+8DDzzww9q1a5dHK6gPhyP2oQwYAKxZ0/bx/v2B1W3OTyIiSmV9+wIbNoTelpMD1NU5+nQcsSdKbRyx17V2bejHQwX7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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "rvar = 1 if np.random.uniform() > 0.2 else 0\n",
    "is_linear = False # A non-linear dataset. Change to True to see results for a linear dataset.\n",
    "data_dict = dowhy.datasets.xy_dataset(10000, effect=rvar, \n",
    "                                      num_common_causes=2, \n",
    "                                      is_linear=is_linear, \n",
    "                                      sd_error=0.2) \n",
    "df = data_dict['df']                                                                                 \n",
    "print(df.head())    \n",
    "dowhy.plotter.plot_treatment_outcome(df[data_dict[\"treatment_name\"]], df[data_dict[\"outcome_name\"]],\n",
    "                             df[data_dict[\"time_val\"]]) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "#### Model assumptions about the data-generating process using a causal graph "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "model= CausalModel(                                                                                                                      \n",
    "        data=df,                                                                                                                         \n",
    "        treatment=data_dict[\"treatment_name\"],                                                                                           \n",
    "        outcome=data_dict[\"outcome_name\"],                                                                                               \n",
    "        common_causes=data_dict[\"common_causes_names\"],                                                                                  \n",
    "        instruments=data_dict[\"instrument_names\"])                                                                                       \n",
    "model.view_model(layout=\"dot\")  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Identify the correct estimand for the target quantity based on the causal model "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Estimand type: nonparametric-ate\n",
      "\n",
      "### Estimand : 1\n",
      "Estimand name: backdoor\n",
      "Estimand expression:\n",
      "     d                                  \n",
      "────────────(Expectation(Outcome|w0,w1))\n",
      "d[Treatment]                            \n",
      "Estimand assumption 1, Unconfoundedness: If U→{Treatment} and U→Outcome then P(Outcome|Treatment,w0,w1,U) = P(Outcome|Treatment,w0,w1)\n",
      "\n",
      "### Estimand : 2\n",
      "Estimand name: iv\n",
      "No such variable found!\n",
      "\n",
      "### Estimand : 3\n",
      "Estimand name: frontdoor\n",
      "No such variable found!\n",
      "\n"
     ]
    }
   ],
   "source": [
    "identified_estimand = model.identify_effect(proceed_when_unidentifiable=True)\n",
    "print(identified_estimand)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Since this is observed data, the warning asks you if there are any unobserved confounders that are missing in this dataset. If there are, then ignoring them will lead to an incorrect estimate. \n",
    "If you want to disable the warning, you can use `proceed_when_unidentifiable=True` as an additional parameter to `identify_effect`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Estimate the target estimand"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "*** Causal Estimate ***\n",
      "\n",
      "## Identified estimand\n",
      "Estimand type: nonparametric-ate\n",
      "\n",
      "### Estimand : 1\n",
      "Estimand name: backdoor\n",
      "Estimand expression:\n",
      "     d                                  \n",
      "────────────(Expectation(Outcome|w0,w1))\n",
      "d[Treatment]                            \n",
      "Estimand assumption 1, Unconfoundedness: If U→{Treatment} and U→Outcome then P(Outcome|Treatment,w0,w1,U) = P(Outcome|Treatment,w0,w1)\n",
      "\n",
      "## Realized estimand\n",
      "b: Outcome~Treatment+w0+w1\n",
      "Target units: ate\n",
      "\n",
      "## Estimate\n",
      "Mean value: 1.9991154434265186\n",
      "\n",
      "Causal Estimate is 1.9991154434265186\n"
     ]
    },
    {
     "data": {
      "image/png": "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9wrPaTOZTJw/f55169axbt26Msk9V1aLH4pDgjohRKkkJiba50jFxMTw4YcfeqwfEBDAxIkTiY2NLf/GCSFEIYXnz6WlpZGamkp8fLzL3HMNGzZk1KhRxco9V5aLH4pD5tQJIUrlzTffBCwTh6dOner1cW3atHF6befOnbz00kv07t2biIgIjEYjYWFhdO3alZdeeonU1FS35xs3bhxKKfr27eu2zoEDB1BKoZRy2XOUnZ3Nu+++S+/evalTpw5Go5G6dety1VVXMXr0aD7++GMyMpx3sStNu0tq8eLF9vdiNps91k1ISLDX3blzp/11rTWbNm1i4sSJdO3albCwMIxGI3Xq1KF3795MnTrVZfJVm8Kf+bp16xg1ahSXXXYZ/v7+BQL3vn37opRi3LhxTucpaTvWrFmDUoopU6YAcPDgQfv7tN0cr2err5TiwIEDbt/X3LlziYmJoUGDBgQGBlKvXj0GDRrEV1995banr/B3Kysri9dff5327dsTHBxM7dq1iY6OJiEhwe11RcUoPH/u999/58MPP3QZ0HXv3p27777b64AuKiqKSZMmMX78+AoP6EB66oQQpZCens6KFSsA6N+/f6kmqv/666907NjR6fXU1FQ2b97M5s2b+eSTT1i+fDktW7Ys8XXcSU9Pp3///k55qE6fPs3p06fZs2cPc+fOJSoqqkA7K6vdgwYNom7duqSkpPDNN9/w6qtO2yrbff311wC0bduW9u3b219fuHChyx7TM2fOsH79etavX89nn33G8uXLiYiI8Nied999l/HjxxfIveWtsmxHaVy8eJFbb72V+fPnF3g9OTmZ5cuXs3z5cj7//HPmzZtHSEiI2/Okp6fTu3dvNm/eXOD1VatWsWrVKqZPn879999fHm9BeME2f64scs85Cg0NLZC2pDJIT50QosQ2btxo32S8V69epTqXUooBAwbw3nvv8eOPP7J//35SUlIwm81MnTqVxo0bc+DAAW655ZZymRf12muvsXXrVgwGA88//zw7duwgOTmZU6dOsX37dt5//3169+7ttAdnZbXb39+fm266CYBvv/3W7bkzMjLsQcrtt9/udI7Y2Fg+/vhjNmzYwIEDB0hOTmbHjh289NJL1KlThx07dvDAAw94bMuePXuYMGECvXv3JjExkeTkZPbv389jjz3m9XspSTt69epFeno6zz77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WsSDDz5YYOiisOzsbF555RXGjBljf81xJwrbL01HGRkZReb0uuaaawBL2oKlS5c6lSclJXncxqyoOYG2wMxxu6CyaHdZsQ2xLlu2jDVr1th7B92tenWcD+mq7adOneLpp58uh5aWfTts/yYpKSklnnN39913A5ah8meeecZlncmTJ9tXrd5zzz0luo4oO7Y9XLXWbN68mRkzZpCcnFygjp+fH4MGDeK2225zO19SKcXTTz/tU8GbOxLUCSFKbdq0afTp0weA6dOn06ZNG/73v/+xc+dOUlJSOH78OJs2beLf//43rVq14rnnnivwyzcyMtLe8/HKK6/wyiuvsG/fPpKTk1myZAk9e/bkl19+oVWrVm7bMHDgQHtKgnHjxvH999+TkpLC0aNH+fzzz+nZs6fH/RvbtGnDwIED+fDDD/nll1/su0ls2rSJe+65hx9++AGw5CAry3aXlVGjRhEYGEhOTo59v9MGDRrQv39/l/WjoqJo0qQJYEm4PG3aNA4ePMiJEyeYPXs21113HcnJyfY65aUs2tG5c2fAss3Xiy++yIkTJ8jNzSU3N9fr1DSdO3e2B3bTpk3jjjvuYNu2bZw5c4adO3fywAMP8NprrwFwww03uE08LMqfLVVJfHw8aWlpfPvttyxZssSpp9aWe+66667zmHuutOl4qhJZKCGEKLXg4GCWL1/OU089xbRp09i3bx/jx493W79+/fo88cQTBV6bNm0avXr1IjU1leeee47nnnvOXqaU4s0332Tnzp3s3bvX5TmNRiMfffQRsbGxnDp1yml+1pVXXslnn33mctcFsKxGXLlyJStXrnTb7kGDBvH888+XabvLSmhoKMOHD2fu3Ln2uY233HKL25WY/v7+fPzxxwwfPpxz58459SgGBATwxRdf2IOs8lIW7bj22mvp1q0bGzdu5N///neBeY9jx47l888/96ot77//PmfOnGH+/Pl8/fXX9iFsR9HR0fbFMaLimM1mEhMTC6S0OXDgAPHx8S6Hyzt06MDQoUMJDAz0eN6oqKhK36+1LElPnRCiTAQEBPC///2PvXv3MmXKFHr27ElkZCQBAQHUrFmTFi1acPPNN/PVV19x4MABp/0z27Zty9atW7nzzjtp0KABRqORyMhIYmNjWbVqFY8//niRbRg6dCjr1q0jJiaG8PBwAgMDadmyJRMnTmTr1q0e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iY6OZt68eUUeq7Vm06ZNTJw4ka5duxIWFobRaKROnTr07t2bqVOnkpmZ6XTcmjVrUEoxZcoUAA4ePIhSqsCt8OKbnTt38tJLL9G7d28iIiIwGo2EhYXRtWtXXnrpJVJTU8vi4/ApZrOZd955hylTptjnw509e5bPPvuM9evXO9W//PLLefDBB4vsZbP9m7nbCUJ2iCgdGX4VQpRYeno6K1euBKBPnz40b97cq+Puvvtu+y/defPmccstt7isl52dzYABA1i3bl2B19esWcOaNWv4xz/+wdSpU52O+/LLL7nrrrucgqbDhw9z+PBhNm3axJ49e5g/f77TsV999RX33XcfFy9eLPD6vn372LdvH5999hnffPMNsbGxbt+f1pqbbrqJ77//3qns9ttv58033+TUqVOsXLnS7fCz1ppZs2YBcPPNN+PvX/DH9YoVK7jpppucAo6DBw8yc+ZMvvzyS9577z0eeughl+d/+OGHmTZtWoHXduzYwY4dO1i0aBG33Xab2/fnjXPnznH99dezadMm+2uZmZmsWrWKVatW8cwzz3g8fuHChS4/4zNnzrB+/XrWr1/PZ599xvLly4mIiChxO3/99Vc6duzo9HpqaiqbN29m8+bNfPLJJyxfvpyWLVuW+Dq+xGw2M2/ePPuCJ601v/32G4sWLXKZe65Xr1707dvXq9xztqAtOjq6wJw6sOSekx0iSkd66oQQJbZx40Z74NSnTx+vj2vcuDGNGzcG4KeffnJb79VXX+XHH3/kiSee4PfffyclJYXVq1fTo0cPAN59912mT59e4JizZ8/y0EMPkZeXR1RUFPPnzycpKYmzZ89y4MABlixZwmOPPUadOnWcrrdgwQLuvPNOLl68yODBg1m6dCnHjx8nOTmZFStW0KtXLzIzM7nlllv49ddf3bb7k08+4fvvv+fBBx9k+/btpKSk8Msvv9C3b186duxImzZtAPjmm2/cnmPdunUcPnwYsASCjrZu3crw4cNJTU2lW7duxMfHc+TIEU6fPs1PP/3EiBEjyM/P55FHHmHp0qVO537//fftAV2vXr1Ys2YNKSkp7Nq1iwkTJrBu3TpeffVVt23zxj333GMP6O677z5+/fVXUlJS+Omnnxg8eDCvvfYaa9eudXu8v78/sbGxfPzxx2zYsIEDBw6QnJzMjh07eOmll6hTpw47duzggQce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pW2nrXd17969bucyQvF7Xl1do6hzuCt3TJx80003uayTk5NT6jlue/futfdiursOwG+//Vaq61Qljou0XnzxRd544w2XAV2vXr246667ihXQgW/+cVqdSFAnRAWrbvmZbEFSfn6+/bEnR48eta8ubdy4MaNHj3Zb94cffnC768LatWvtq0899fY58vf354UXXrA/dwwqBg4cCFhy7x06dMir85XWDTfcQM2aNe0T9W0JicH10KtjO48cOcLPP/9c7GvaFmjYkvi6kpubyw8//FDscxe+xsqVK932cu3evdvtfDrH4WJ3//62Hk13bH84edq1w5vrbN68mf3797s9hy9ZvHgx8fHxJCcns2DBApe550JCQoqVe86Rr/5xWp1IUCdEJWjXrh3jx4+vFkv9hwwZwo033ghYFhk89dRT5Ofnu6x76tQphg4dSnp6OkopZsyY4bRTgqPDhw/z1ltvOb2elZXF008/DVgWWcTExNjLkpKSyM7OdntOx1/QjgmI77zzTurWrUtubi533XWXx4ABcBuQFEeNGjXsPZXffPMNs2fPJi8vj6CgIEaOHOnymOuvv56rr74agPvvv99tOhh37bzhhhvsizL+9a9/ufys/vOf/3D06NHivh27sWPHApb5gc8//7xTeV5eHo8//rjb4x0XmrhK+XLq1Cn7v787tn/blJQUt3PhHOeEurpORkYGDz/8sMfr+Aqz2czWrVs5fvw406dP55dffnGqc+WVV/Lggw/ae4OLw9f/OK0uJKgTQpTajBkzuOaaawB488036dGjB7NmzSIpKYnTp09jNpt57bXXaNOmjX1o7dVXX3W7RZZN06ZNefbZZ3nqqafYs2cPp0+fZu3atQwYMMCezuKVV14hKCjIfszMmTNp0qQJEyZMYMmSJRw8eJDU1FT++usvZs6caQ+WQkJCGDJkiP244OBgPv30U5RSrFq1is6dO/PJJ5+wb98+UlNTOX78OBs2bODNN9/k2muvZdSoUWXy2dl65LZv324PYGNiYqhVq5bL+n5+fsycOZOgoCB+++03OnTowNSpU9m9ezdnz57l5MmTbNmyhffff5/+/fsTFRVV4HiTycRLL70EWHolBw4cyLp16zh9+jS7d+/m8ccf5//+7/8KBDzF1a1bN3sP7Ntvv80DDzyA2WzmzJkz/Pzzz8TExLB06VK314iKirIP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RPkokzl1DRs2zJ87d+7ZHj16ZB89etTw4osv1ixc56uvvgq67rrr6tSqVauByWSKbNOmTcTkyZNrFh4m7d+/fxb8HaDZ7N+/33Do0CFDv379srp37569fv16p1noa9euDQQYOHCgyzwD+/fvN4wcOTKsTp069YOCgiI7duxYNz4+vsB5fvvtN3+lVGTPnj3d/onepk2bCKPRGHnkyBGvPr8ff/zReMMNN4TVq1evfkBAQORll11W/6677go9fPiw0/Fz5swJ7N27d5369evXDwwMjGzQoEH97t2713n77bdr2Oo8++yzIS1atKgHMGvWLJPjsPj06dNN7oY5HV/fu3ev4YYbbggLDw9vULNmzQb9+vUL37Fjhz/AiRMn/MaNGxdav379+kFBQZGdOnWqu2zZMqcgevr06aaYmJiwJk2a1DOZTJEhISENunbtWveTTz5x2rurqDaX5LPy1o8//kjfvn2pVasW/v7+NGnShJdeeqnIYMWWe+7DDz9Ea01MTIy9zDH33A8//EB0dDSRkZEEBgbSsGFD+vTpwwcffOB1G7/77jt69+5NaGgoJpOJdu3a8eqrrzqlzHCcm7dnzx5iY2MJDw8nODiYnj17snz5crfX2LRpE6NHj6ZBgwYEBATQqFEjHnjgAY4dO+ay/i233MKhQ4dYsWKF1++jvPTv35+YmBinPH8NGjTgwQcfBGDNmjVen2///v0sX76cpk2b8sgjjxQomzJlCsHBwXz55ZdcuHCh1G0XQoiKUmYLJQwGA88991w6wJw5c0yOvzCfeOKJkDvvvDPsjz/+8L/xxhsz77vvvgtaa6ZMmRISHR1dx/EX18CBA7MB1qxZUyDYWrZsWSDAgAEDsvr27Zt18uRJv507d9qHj1NTU9WOHTuMtWvX1tdee61TwrBDhw4ZunbtWvfQoUOGm2++OTMuLi5zz549xhtvvDHcMWBp27Ztbs+ePbN/+umngN9//91pctTatWuNu3fv9h8yZMhFb3rCpk2bZurbt2/dlStXBvbq1SvroYceutCxY8fsL774osY111wTkZSUZL/Gu+++W+PGG28M37t3r/+QIUMuPvroo+evv/76ixcvXlRffPGFPajr169f1oMPPngB4Oqrr8595plnzttunTt3LnKrt4MHDxq6d+9e99SpU3633XZbRr9+/bLWrl0bGB0dXWf37t2Gbt261d22bVvAyJEjM2NjYzN37dplHDFiRB3HtgKMHz++9uHDhw09evTIfuihh86PGjUq8/Dhw4Z777239tNPPx3iWNebNhfns/LWc889R+/evUlNTeXBBx/kvvvu49y5czz//PO8/PLLbo/Lzc0lJSWF8+fPs379egwGA126dAEsPaERERGYTCZmzJjBiBEj+P3334mJieGJJ55g6NChZGZm8tlnn3nVxokTJ3LzzTeze/dubrvtNh599FG01kycOJFBgwaRne3c8ZyUlMR1113HmTNneOCBB7jxxhvZtm0bQ4YMYfbs2U71P/30U3r06EFCQgL9+vVj/PjxREVF8fHHHxMVFcWhQ4ecjunRowdAlQjqPLH1khYnF+Dq1asBuP76650CxZCQEHr06EFGRgYbN24su4YKIUR5mzx58sCvv/76qNb6mKcboAHtqU5mZuYxf39/Deg//vjjpNb62Nq1a5MBfdlll+UeOXLkhK1udnb2sUGDBl0E9AsvvHDO8Tz169fPU0rp48eP2+uPHj06Izg4OD87O/vYjh07TgH6zTffTLWVz5kz5zSghw0blul4rn379p20tf3ZZ58tcJ2FCxeeBvSAAQMuOr7+9ddfnwH0o48+er7we7z11lszAP3DDz+cLuoz27Vr10mj0aibNm2ae/DgwROOZUuWLEnx8/PTQ4cOtbe3ffv22QEBAfrYsWMnCp/r5MmTJ1y9r1tvvTWjcF13ZY6fxfPPP1/gs3juuefOAbp27dr5d91114Xc3Fx72UcffXQW0A899FCBz2PPnj0nC1/74sWLx3r16pXl7++vC79nT20u7meltT526tQp7cl///tfDeinn35a5+fn21/fvn27tr5XnZeX53TchQsX9LFjx/TRo0f1n3/+qQ0Gg27durU+evSoTktLK3Cuzp0764CAAH3y5Emn8yQnJ9sfJyUlaUCPHTu2QJ0NGzZoQDdq1EgfP37c/npOTo4ePny4BvTLL7/sdB5AP/nkkwXOtWXLFu3v769r166t09LS7K/v3btXG41G3bx5c33kyJECx6xcuVL7+fnp2NhYp/anpqZqQF9zzTVOZe68/fbbetKkSV7f5s2b5/W5XcnJydFt27bVgF66dKnXxz355JPa+jPEZfkjjzyiAf3BBx+4Pcf333+vk5KSittkIYQoMWCr1hp3tzIN6rTWxyIiIvIA/eOPPyZrrY+NGTPmAqCnTp2aWrjurl27Tvr5+enGjRvnOr5+0003ZQD6yy+/PGN7rX79+nmOwVfdunXzHAO4hx566Dyg33rrrQLXsQUSjRo1ys3JyXFq7+WXX54bHh6e5/hadnb2sfr16+eFh4fnZWZm2l8/ffr08aCgoPymTZvm5uXlefwcHNsUHx/vMgAcOnRopsFg0Kmpqce1NagzmUz5KSkpx4s6d2mCOlefxV9//XUS0CaTKd/WHtstJyfnmL+/v+7Ro0dWUe3SWh+bNWvWGUDPmDHjrLdtLu5npYsI6o4ePaqDg4P1dddd5zJwa926tQb0gQMH7K/l5eXpM2fO6KNHj9pv69at04Du3bu3vnjxotN5OnfurGvUqKHPnDnjti1auw/q7r33Xg3o6dOnOx2zd+9e7efnp5s1a+Z0ntDQUH3u3DmnY8aOHasB/fnnn9tfGz9+vLb+IeKybbGxsdpgMLg8X1BQkK5fv77H9+aoSZMm9qDTm1vhz6O4nnjiCQ3ooUOHFuu4++67TwP6o48+clk+ceJEDehXXnnF7TkkqBNCVLSigroyTz6srZn1bavQduzYYQTX89zatGmT17Bhw7xDhw4Zzp49q8LCwjRYhuq+++4706pVqwLvuOOOi2az2f/kyZN+jz76qP0cPXv2zF6zZk1gXl4eBoPBPp/u+uuvd7lIom3btjmuhmcuu+yyvC1bthSYL2Y0Ghk3blzG66+/XvPbb781jRs3LhPg008/rXHx4kV19913X/BmD8/NmzcHgGUo2fbYUUpKiiEvL4/du3f7d+vWLeeWW27JnDhxYq02bdrUGzVqVGbfvn2ze/fund2gQYMynanerl07p8/i8ssvzwNo3rx5XmhoaIFVx/7+/kREROQfO3aswPBnUlKS4ZVXXqm5Zs2agCNHjhguXrxYYOnh0aNHvR4uLe5nVdT5Zs2axYULF3j88cdd7rcaHBwMYE8/kp2dzdmzZ8nLK7hw25baon79+i6TCd9+++088cQTtGnThltuuYU+ffrQo0cPIiIiin7TwPbt2wHLnLHCrrzySi6//HKSkpJIS0sjNDTUXta5c2dCQkKcjunbty8zZ87kl19+YezYsQD8/PPPAKxdu5YtW7Y4HXPq1Cny8vL4448/7EPMNuHh4Zw8edKr9wKWOX8VZerUqbz11lu0bt2aL7/8ssKuK4QQVVWZBnWZmZmkpqb6AdSvXz8f4Ny5c34Al112mcvApH79+vlHjhwxnD171i8sLCwPYNCgQQXm1S1fvjwAYMCAAfaArU+fPlnz588P2rJli7Fp06Z5u3fv9o+MjMxv27aty2R5hdOj2BgMBpcT5h9++OELb775Zs0ZM2bUcAzqAgICuO+++zK9+TzOnDnjBzB16tRgT/XOnz+vAJ599tkLdevWzZ8+fXrw9OnTg6dNmxaslKJ79+7Zb7zxxrnrrruuyGDGG4WDNvh7XlKtWrVc/jv5+/trx9xsf/zxh+G6666rm5qa6tetW7fs/v37Z4WGhmqDwcDBgwcNs2bNMmVlZXmdX6K4n1VRFixYgJ+fH0OHDnVZfvToUYKDg4mMjOT8+fOcO3fOZT1bcOZuj8/HH3+cunXr8sEHHzB16lTeeecdlFL06dOHN954g6ioKI/tTEtLAyAyMtJleWRkJIcOHSI1NbVAUFe/fn2X9Rs0aFDgvIB90/k33njDY1tc5aTLzMx0WvFbFbz33nv885//pE2bNiQmJhIeHl6s422fpePn5Mj2eu3atUvVTiGEqEhlGtStXr06IDc3l4iIiPzmzZvngT1IMBw7dsyvVatWTvnrTp486QfgmFOtWbNmeU2bNs1LSkoyHDhwwG/16tWBoaGh+pprrrEHNbYAb+XKlQFNmzbN01rTp0+fMttdu3HjxvmDBw++uHjx4qDffvvN//Tp02r37t3+cXFxF73tObO997Nnz55wF1QWdt9992Xed999mWfOnFHr1q0LmDdvXtBXX31VY9iwYXV+//33U2Xda1dSb7zxRs0zZ874ffjhh6kPPPBAgSB35syZplmzZhUrEijJZ+VObm4umzdvpm7dutSoUcOpfMuWLZw4cYJhw4aRmprqMmCz5Z6zsQVGrowZM4YxY8aQmprKhg0bmDdvHp9++imDBg1iz549HnvtbMHFiRMnaN68uVP58ePHC9Szcdd7duLECaf6jgFMrVq13LalsPz8fFJTU2nWrJnXx7zzzjukpqZ6Xb9jx47ExsZ6Xd92jQkTJtC2bVsSExOpV69esY4HaNWqFQB//PGHy/I///wTsPSWCiGEryizoC4vL49XXnklBODGG2+0/5Lv0KFDzs6dO42JiYmBrVq1KpAseM+ePYZjx44ZGjdunBceHl7gF3nfvn2zPv/88xpLly4N/OmnnwK7d++e5Zipv23btrn16tXLX7NmTWDjxo3z4O90KGXl4YcfvrB48eKgDz74oIatB/KBBx7wOsfBNddck/Prr78aV69eHRAXF1estoWHh+vY2Nis2NjYrPz8fL766qsaq1evDrj11lsvAhgMBg04DRdWlL/++ssAcMsttzht3bF27Vqn4VPw3ObSfFaF7dq1i6ysLLKzs8nPz3cafn3rrbcAuOmmm1wGdDVq1KBWrVr4+fkRGRlJREQEe/fuLfK6tWvXZujQoQwdOpT8/Hw+/fRT1q1bx6hRo9we06lTJ7Zv386aNWucgrp9+/Zx5MgRmjVr5tRjtH37dtLT052GYG1pPTp16mR/rVu3bmzbto3169czbNiwIt+Hzd69e9Fa07FjR6+Peeeddzh48KDX9ceOHVusoO7111/nmWeeoWPHjqxYsYK6dV1uPlOkfv36AbB8+XKn70h6ejo//fQTNWrUoFu3biU6vxBCVIYySWly/Phxv1GjRoX99NNPAZdffnnepEmT7OM499xzTwbAa6+9VvPEiRP26+Xm5vL444/Xys/PZ+zYsU6baNoCtKlTp9ZMTU1Vffv2dZor16tXr6yff/45wJbTbtCgQWUa1A0ePDi7efPmebNmzaoxb968oBYtWuTahoa98c9//vOC0WjkySefDHWVHiUrK4tVq1bZA6Bly5YFuBoKTk5ONgDUqFHDHviGh4drpRSHDx+ulD2pmjRpkgeWnlLH1xctWhTomH7Fkac2F/ez8mTbtm0ApKamsnTp0gJl7733HrNnz6Zfv34MGDCgQJlj7jnbL3mlFL179yYlJYV9+/Y5XWv16tX2eaSOTp06BeCyp9DR3XffDcBLL71EcnKy/fW8vDyefPJJ8vPzueeee5yOS0tL48UXXyzw2tatW/n6668JDQ0lLi7O/vqjjz6K0WhkwoQJLnumsrOzWb9+vdPrtnQetgDIGwcOHHA7gdfV7fPPP/f63P/+97955pln6NKlC4mJiV4FdPv372fPnj3k5BScudC8eXOuv/56Dhw4wPvvv1+gbNKkSVy4cIE777zTPvdSCCF8QbF76p599tkQsA/NqN27dxs3bdoUkJ2dTefOnXO+/vrrs/Xq1bNHJn369Mn55z//ef5///tfzXbt2kXExsZerFGjhl6xYkXg7t27/bt27Zr93HPPOU3mGThwYLZSit27d/tbnzsFbH379s2eO3eu6dChQ4YWLVrkNm7cuEyHJv38/Lj33nsvPPvss7UA7r77bucd3D1o27Zt7rRp01Ifeuih2h06dKgXHR2d1aJFi9ycnBwOHz5s2LhxY2CdOnXy/vzzz2SAm266KTw4OFhHRUVlN2nSJE9rzYYNGwJ++eUXY4cOHXKGDBli/wxq1aqlu3TpkrNx48aAG2+8sXbLli1zDQYDcXFxF13NmStrjz766IWvv/66xu233x4+e/bszMjIyPzff//dPzExMTA2NvbivHnznPZp89Tmzp07F+uz8sQW1MXExDB69Ghuu+02IiIiWLduHRs2bKBDhw689957BY4JCAigdu3aLnOdjRo1irlz57Js2TJatGhRoCwuLo6aNWvSrVs3mjZtitaa9evXs2XLFrp06eIUOBbWvXt3nn76af7zn//Qtm1bRo8eTXBwMAkJCfz222/07NmTp556yum43r178/HHH7Np0yZ69OjB8ePHmT17Nvn5+UyfPr3AMGvr1q359NNPufvuu7n66qsZPHgwV155JTk5ORw6dIj169cTERHBnj17Clxj+fLlGAwGRowY4fkDrwAzZ87khRdewGAw0KtXL6ZOnepUp2nTpowbN67Aa9HR0Rw8eJCkpCSaNm1aoOyDDz6ge/fuPPbYYyQmJnLVVVexadMmVq9ezZVXXukxj6EQQlRJxU1pYrsFBATo8PDwvPbt22ePGTPmwoIFC0475jYrfJs5c+aZrl27ZgUHB+cHBgbqVq1a5Tz//PPnMjIy3B7Tpk2bHECHh4fnuUohsnv3bnvetXvvvfeCq3N4SqOhtT7WvXv3LDykaklJSTnu5+eng4KC9KlTp4pMNeLqtn379lO33nprxuWXX54bEBCga9eund+6deuccePGXUhISEix1XvnnXdShw4dmtm4cePcoKCg/Nq1a+e3bds258UXX0wrnGbE9v4HDRp0MSwsLF8ppQH94Ycfni0qpYm7zwLQ3bt3d5m2pFGjRrmNGjUqkHpmzZo1yT179swKDQ3NDw4Ozu/atWvW7NmzzyxbtiwF0M8880y6t20u7melPaQ06dq1qw4ICNAZGRn6mWee0Q0bNtQBAQG6efPm+umnn9b79+8vkLakcO65wrKysnS9evX0tdde61Q2bdo0HRsbq5s1a6ZNJpMOCwvTHTt2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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "estimate = model.estimate_effect(identified_estimand,\n",
    "        method_name=\"backdoor.linear_regression\")\n",
    "print(estimate)\n",
    "print(\"Causal Estimate is \" + str(estimate.value))\n",
    "\n",
    "# Plot Slope of line between action and outcome = causal effect                                                                                                 \n",
    "dowhy.plotter.plot_causal_effect(estimate, df[data_dict[\"treatment_name\"]], df[data_dict[\"outcome_name\"]])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As you can see, for a non-linear data-generating process, the linear regression model is unable to distinguish the causal effect from the observed correlation. \n",
    "\n",
    "If the DGP was linear, however, then simple linear regression would have worked. To see that, try setting `is_linear=True` in cell **10** above.\n",
    "\n",
    "To model non-linear data (and data with high-dimensional confounders), we need more advanced methods. Below is an example using the double machine learning estimator from EconML. This estimator uses machine learning-based methods like gradient boosting trees to learn the relationship between the outcome and confounders, and the treatment and confounders, and then finally compares the residual variation between the outcome and treatment."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "*** Causal Estimate ***\n",
      "\n",
      "## Identified estimand\n",
      "Estimand type: nonparametric-ate\n",
      "\n",
      "### Estimand : 1\n",
      "Estimand name: backdoor\n",
      "Estimand expression:\n",
      "     d                                  \n",
      "────────────(Expectation(Outcome|w0,w1))\n",
      "d[Treatment]                            \n",
      "Estimand assumption 1, Unconfoundedness: If U→{Treatment} and U→Outcome then P(Outcome|Treatment,w0,w1,U) = P(Outcome|Treatment,w0,w1)\n",
      "\n",
      "## Realized estimand\n",
      "b: Outcome~Treatment+w0+w1 | \n",
      "Target units: ate\n",
      "\n",
      "## Estimate\n",
      "Mean value: 0.9640759858071759\n",
      "Effect estimates: [0.96407599 0.96407599 0.96407599 ... 0.96407599 0.96407599 0.96407599]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "from sklearn.linear_model import LassoCV\n",
    "from sklearn.ensemble import GradientBoostingRegressor\n",
    "dml_estimate = model.estimate_effect(identified_estimand, method_name=\"backdoor.econml.dml.DML\",\n",
    "                                     control_value = 0,\n",
    "                                     treatment_value = 1,\n",
    "                                 confidence_intervals=False,\n",
    "                                method_params={\"init_params\":{'model_y':GradientBoostingRegressor(),\n",
    "                                                              'model_t': GradientBoostingRegressor(),\n",
    "                                                              \"model_final\":LassoCV(fit_intercept=False), \n",
    "                                                              'featurizer':PolynomialFeatures(degree=2, include_bias=True)},\n",
    "                                               \"fit_params\":{}})\n",
    "print(dml_estimate)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As you can see, the DML method obtains a better estimate, that is closer to the true causal effect of 1. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Check robustness of the estimate using refutation tests"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Refute: Add a Random Common Cause\n",
      "Estimated effect:0.9640759858071759\n",
      "New effect:0.9331218724624653\n",
      "\n"
     ]
    }
   ],
   "source": [
    "res_random=model.refute_estimate(identified_estimand, dml_estimate, method_name=\"random_common_cause\")\n",
    "print(res_random)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Refute: Use a Placebo Treatment\n",
      "Estimated effect:0.9640759858071759\n",
      "New effect:9.847648418438584e-06\n",
      "p value:0.4920449538936432\n",
      "\n"
     ]
    }
   ],
   "source": [
    "res_placebo=model.refute_estimate(identified_estimand, dml_estimate,\n",
    "        method_name=\"placebo_treatment_refuter\", placebo_type=\"permute\",\n",
    "        num_simulations=20)\n",
    "print(res_placebo)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Case-studies using DoWhy+EconML\n",
    "In practice, as the data becomes high-dimensional, simple estimators will not estimate the correct causal effect. More advanced supervised machine learning models also do not work and often are worse than simple regression, because they include additional regularization techniques that help in minimizing predictive error, but can have unwanted effects on estimating the causal effect. Therefore, we need methods targeted to estimate the causal effect. At the same time, we also need suitable refutation methods that can check the robustness of the estimate. \n",
    "\n",
    "\n",
    "Here is an example of using DoWhy+EconML for a high-dimensional dataset.\n",
    "\n",
    "\n",
    "More details are in this [notebook](https://github.com/microsoft/dowhy/blob/master/docs/source/example_notebooks/dowhy-conditional-treatment-effects.ipynb). \n",
    "\n",
    "\n",
    "Below we provide links to case studies that illustrate the use of DoWhy+EconML.\n",
    "\n",
    "### Estimating the impact of a customer loyalty program\n",
    "[Link to full notebook](https://github.com/microsoft/dowhy/blob/master/docs/source/example_notebooks/dowhy_example_effect_of_memberrewards_program.ipynb)\n",
    "\n",
    "\n",
    "###\tRecommendation A/B testing at an online company\n",
    "[Link to full notebook](https://github.com/microsoft/EconML/blob/master/notebooks/CustomerScenarios/Case%20Study%20-%20Recommendation%20AB%20Testing%20at%20An%20Online%20Travel%20Company%20-%20EconML%20%2B%20DoWhy.ipynb)\n",
    "\n",
    "###\tUser segmentation for targeting interventions\n",
    "[Link to full notebook](https://github.com/microsoft/EconML/blob/master/notebooks/CustomerScenarios/Case%20Study%20-%20Customer%20Segmentation%20at%20An%20Online%20Media%20Company%20-%20EconML%20%2B%20DoWhy.ipynb)\n",
    "\n",
    "### Multi-investment attribution at a software company\n",
    "[Link to full notebook](https://github.com/microsoft/EconML/blob/master/notebooks/CustomerScenarios/Case%20Study%20-%20Multi-investment%20Attribution%20at%20A%20Software%20Company%20-%20EconML%20%2B%20DoWhy.ipynb)\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Connections to fundamental machine learning challenges\n",
    "Causality is connected to many fundamental challenges in building machine learning models, including out-of-distribution generalization, fairness, explanability and privacy. \n",
    "\n",
    "![ML challenges](images/causality_ml_example_challenges.png)\n",
    "\n",
    "How causality can help in solving many of the challenges above is an active area of research. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Further resources\n",
    "\n",
    "### DoWhy+EconML libraries\n",
    "DoWhy code: https://github.com/microsoft/dowhy\n",
    "\n",
    "DoWhy notebooks: https://github.com/microsoft/dowhy/tree/master/docs/source/example_notebooks\n",
    "\n",
    "EconML code: https://github.com/microsoft/econml\n",
    "\n",
    "EconML notebooks: https://github.com/microsoft/EconML/tree/master/notebooks\n",
    "\n",
    "### Video Lecture on causal inference and its connections to machine learning\n",
    "Microsoft Research Webinar: https://note.microsoft.com/MSR-Webinar-DoWhy-Library-Registration-On-Demand.html\n",
    "\n",
    "\n",
    "### Detailed KDD Tutorial on Causal Inference\n",
    "https://causalinference.gitlab.io/kdd-tutorial/\n",
    "\n",
    "### Book chapters on causality and machine learning\n",
    "http://causalinference.gitlab.io/\n",
    "\n",
    "### Causality and Machine Learning group at Microsoft\n",
    "https://www.microsoft.com/en-us/research/group/causal-inference/\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": true,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": true,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "165px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
